【发布时间】:2019-07-13 10:54:31
【问题描述】:
我使用 MapStruct 来映射我的实体,我正在使用 Mockito 模拟我的对象。
我想测试一个包含与 mapStruct 的映射的方法。 问题是嵌套映射器在我的单元测试中始终为空(在应用程序中运行良好)
这是我的映射器声明:
@Mapper(componentModel = "spring", uses = MappingUtils.class)
public interface MappingDef {
UserDto userToUserDto(User user)
}
这是我的嵌套映射器
@Mapper(componentModel = "spring")
public interface MappingUtils {
//.... other mapping methods used by userToUserDto
这是我要测试的方法:
@Service
public class SomeClass{
@Autowired
private MappingDef mappingDef;
public UserDto myMethodToTest(){
// doing some business logic here returning a user
// User user = Some Business Logic
return mappingDef.userToUserDto(user)
}
这是我的单元测试:
@RunWith(MockitoJUnitRunner.class)
public class NoteServiceTest {
@InjectMocks
private SomeClass someClass;
@Spy
MappingDef mappingDef = Mappers.getMapper(MappingDef.class);
@Spy
MappingUtils mappingUtils = Mappers.getMapper(MappingUtils.class);
//initMocks is omitted for brevity
@test
public void someTest(){
UserDto userDto = someClass.myMethodToTest();
//and here some asserts
}
mappingDef 注入正确,但mappingUtils 始终为空
Disclamer:这不是this question 的副本。他正在使用@Autowire,所以他正在加载弹簧上下文,所以他正在做集成测试。我正在做单元测试,所以我不使用@Autowired
我不想让mappingDef 和mappingUtils @Mock 所以我不需要在每个用例中都做when(mappingDef.userToUserDto(user)).thenReturn(userDto)
【问题讨论】:
-
您使用的是什么版本的 mapstruct?最新版本为 Spring 提供了构造函数注入,因此您可以模拟每个嵌入式 bean 并创建实例。
-
我使用的是 1.2.0 版。我没有看到版本 1.3.0 变得稳定(就在上周)。我会尝试升级。你有一个关于如何做的例子吗?我在文档中需要添加 InjectionStrategy.CONSTRUCTOR,但我不确定我是否理解得很好。我怎样才能用我的用例做到这一点?
-
在 CDI 中,这意味着 MapStruct 生成一个将其他映射器作为参数的构造函数。我对Spring不太熟悉..但我想它的工作原理是一样的。我个人会选择一个在测试中为你执行注入的库。我认为我们在 MapStruct 联合中做了类似的事情 ..
标签: java unit-testing mockito mapstruct