如何为通过Spring注入的mapstruct抽象Map器编写Junit测试

vd8tlhqk  于 2022-11-11  发布在  Spring
关注(0)|答案(8)|浏览(174)

我使用MapStruct,mapstruct-jdk 8版本1.1.0.Final,并定义通过Spring注入的抽象类。
我正在研究如何通过Junit测试来测试它们?我基本上有一个主Map器,它将使用2个子Map器

@Mapper(componentModel = "spring", uses = {SubMapper1.class, SubMapper2.class})
public abstract class MainMapper {

  @Mapping(target = "field1", qualifiedByName = {"MyMapper2Name", "toEntity"})
  public abstract MyEntity toEntity(MyDto pDto);

  public MyDto fromEntity(MyEntity pEntity) {
     // Specific code, hence why I use Abstract class instead of interface. 
  }
}

我已经尝试了几种方法,但是无法正确地示例化Map器来测试它。

@RunWith(SpringRunner.class)
public class MainMapperTest {

    private MainMapper service = Mappers.getMapper(MainMapper.class);

    @Test
    public void testToEntity() throws Exception {
.....

java.lang.RuntimeException:java.lang.ClassNotFoundException:无法找到com.mappers的实现。MainMapper
我也试过通过@InjectMock,但也没有骰子。
无法示例化名为“service”的@InjectMocks字段。您尚未在字段声明中提供该示例,因此我尝试构造该示例。但是,我失败了,原因是:类型“MainMapper”是一个抽象类。
通过Spring @Autowired
导致的错误:没有类型为“com. mapers.MainMapper”的合格Bean可用:至少应有1个符合自动连接候选条件的Bean。依赖关系注解:{@org.springframework.beans.工厂.注解.自动连接(必需=true)}
我猜这可能与注解处理器有关,当我启动测试时,没有生成Map器。我找到了this class as example
然而,类AnnotationProcessorTestRunner似乎在1.2之前不可用,1.2还没有最终版本。
因此,我的问题是如何编写Junit测试来测试我的mapstruct抽象类Map器,我在代码中通过Spring注入使用了该Map器。

ih99xse1

ih99xse11#

作为对@ RichardLewan评论的回应,这里是我如何使用2个subMapper为抽象类ConfigurationMapper声明测试类的

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ConfigurationMapperImpl.class, SubMapper1Impl.class, SubMapper2Impl.class})
public class ConfigurationMapperTest {

SpringBootTest注解中使用Impl生成的类,然后注入要测试的类:

@Autowired
private ConfigurationMapper configurationMapper;

如果你需要更多的信息,请告诉我,但从那里开始就很简单了。我没有嘲笑subMapper,因为对我来说,一次测试所有的Map过程更好。

7kqas0il

7kqas0il2#

对@TheBakker的回答的补充:作为@SpringBootTest的一个更简单的替代,如果你不需要整个SpringBoot堆栈,你可以使用@ContextConfiguration

@ExtendWith(SpringExtension.class) // JUnit 5
@ContextConfiguration(classes = {
            ConfigurationMapperImpl.class,
            SubMapper1Impl.class,
            SubMapper2Impl.class
        })
public class ConfigurationMapperTest {
...

对于JUnit 4,请使用注解RunWith而不是ExtendWith

@RunWith(SpringRunner.class)       // JUnit 4
...
ergxz8rk

ergxz8rk3#

使用Mockito:

@Spy
private EntityMapper entityMapper = Mappers.getMapper(MyMapper.class);

请记住,在测试中将mock注入到类中,例如:

@InjectMocks
private MyClassUnderTest myClassUnderTest
oalqel3c

oalqel3c4#

您有多个问题:

  1. Mappers#getMapper(Class)只能与默认的componentModel一起使用,否则Map器将无法正确示例化。如果您在此处获取RuntimeException,则意味着未生成实现类。请确保您的设置正确
    1.您需要对MainMapperImpl实现进行测试,而不是对抽象类进行测试。
    1.如果你想用springbean进行测试,那么你需要使用正确的ComponentScan,并确保实现和使用的Map器可以自动连接。
    您链接的类是一个错误的测试类,并且与您的测试用例无关。请查看Spring集成的this集成测试用例。
    AnnotationProcessorTestRunner是我们测试的一部分,用于测试注解处理器,从一开始就在那里。它不是发布的一部分。
uqcuzwp8

uqcuzwp85#

假设:

  • 您的MainMapperMap器被注入到@Component ConverterUsingMainMapper

您可以使用下列范例:

@RunWith(SpringRunner.class)
@ContextConfiguration
public class ConsentConverterTest {

    @Autowired
    MainMapper MainMapper;

    @Autowired
    ConverterUsingMainMapper converter;

    @Configuration
    public static class Config {

        @Bean
        public ConverterUsingMainMapper converterUsingMainMapper() {
            return new ConverterUsingMainMapper();
        }

        @Bean
        public MainMapper mainMapper() {
            return Mappers.getMapper(MainMapper.class);
        }
    }

    @Test
    public void test1() {
        // ... your test.
    }

}
kse8i1jr

kse8i1jr6#

您也可以使用Map器及其协作者手动创建应用程序上下文:

ApplicationContext context = new AnnotationConfigApplicationContext(MainMapperImpl.class, SubMapper1Impl.class, SubMapper2Impl.class);

ApplicationContext context = new AnnotationConfigApplicationContext("package.name.for.your.mappers");

然后从上下文获取Map器

MainMapper mainMapper = context.getBean(MainMapper.class);
v2g6jxz6

v2g6jxz67#

百分之百有效!
第一个

vcirk6k6

vcirk6k68#

为了Map一个结构,您将使用下面
Map器.getMappers(您的Map器类在此. class)
例如:-
如果您有任何问题,请联系我们。
在此处使用INSTANCE变量并访问Map器类方法。
然后使用SpringRunner.class运行
@运行方式(SpringRunner.class)
如果您发现未找到植入物或未在正在测试的测试类中找到类的问题,则执行如下maven clean测试。
MVN清洗试验
那你应该可以接受你的测试。
参考编号:-
https://mapstruct.org/development/testing-mapstruct/

相关问题