我使用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器。
8条答案
按热度按时间ih99xse11#
作为对@ RichardLewan评论的回应,这里是我如何使用2个subMapper为抽象类ConfigurationMapper声明测试类的
在
SpringBootTest
注解中使用Impl
生成的类,然后注入要测试的类:如果你需要更多的信息,请告诉我,但从那里开始就很简单了。我没有嘲笑subMapper,因为对我来说,一次测试所有的Map过程更好。
7kqas0il2#
对@TheBakker的回答的补充:作为
@SpringBootTest
的一个更简单的替代,如果你不需要整个SpringBoot堆栈,你可以使用@ContextConfiguration
。对于JUnit 4,请使用注解
RunWith
而不是ExtendWith
:ergxz8rk3#
使用Mockito:
请记住,在测试中将mock注入到类中,例如:
oalqel3c4#
您有多个问题:
Mappers#getMapper(Class)
只能与默认的componentModel
一起使用,否则Map器将无法正确示例化。如果您在此处获取RuntimeException
,则意味着未生成实现类。请确保您的设置正确1.您需要对
MainMapperImpl
实现进行测试,而不是对抽象类进行测试。1.如果你想用springbean进行测试,那么你需要使用正确的
ComponentScan
,并确保实现和使用的Map器可以自动连接。您链接的类是一个错误的测试类,并且与您的测试用例无关。请查看Spring集成的this集成测试用例。
AnnotationProcessorTestRunner
是我们测试的一部分,用于测试注解处理器,从一开始就在那里。它不是发布的一部分。uqcuzwp85#
假设:
MainMapper
Map器被注入到@Component ConverterUsingMainMapper
您可以使用下列范例:
kse8i1jr6#
您也可以使用Map器及其协作者手动创建应用程序上下文:
或
然后从上下文获取Map器
v2g6jxz67#
百分之百有效!
第一个
vcirk6k68#
为了Map一个结构,您将使用下面
Map器.getMappers(您的Map器类在此. class)
例如:-
如果您有任何问题,请联系我们。
在此处使用INSTANCE变量并访问Map器类方法。
然后使用SpringRunner.class运行
@运行方式(SpringRunner.class)
如果您发现未找到植入物或未在正在测试的测试类中找到类的问题,则执行如下maven clean测试。
MVN清洗试验
那你应该可以接受你的测试。
参考编号:-
https://mapstruct.org/development/testing-mapstruct/