未在Spring单元测试中注入MapStruct映射器

时间:2017-06-02 13:33:55

标签: spring unit-testing dependency-injection mapstruct

我使用MapStruct生成的一个映射器:

@Mapper
public interface CustomerMapper {
   Customer mapBankCustomerToCustomer(BankCustomerData bankCustomer);
}

默认组件模型是spring(在pom.xml中设置)

<compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg>

我有一个服务,我在其中注入客户映射器并在运行应用程序时正常工作

@Autowired
private CustomerMapper customerMapper;

但是当我运行涉及@SpringBootTest

的单元测试时
@SpringBootTest
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
public class SomeControllerTest {

    @Mock
    private SomeDependency someDependency;

    @InjectMocks
    private SomeController someController;

    @Test
    public void shouldDoSomething() {
        ...
    }

}

我得到一个org.springframework.beans.factory.UnsatisfiedDependencyException

  

通过字段&#39; customerMapper&#39;

表达的不满意的依赖关系

2 个答案:

答案 0 :(得分:1)

我遵循了这个answer,我的问题在我在build.gradle文件中粘贴建议的行时得到了解决

答案 1 :(得分:0)

当您通过IDE运行测试时,有两种可能性:

  1. Eclipse或IntelliJ正在选择注释处理器,您需要正确设置它们。
  2. Eclipse或IntelliJ不从maven编译器中选择编译器选项
  3. 为了排除各种可能性,请对每种方法进行以下操作:

    1. 确保IDE配置为运行APT。看看here如何设置它。从IDE运行构建并检查是否生成了映射器类
    2. 如果有可能是使用默认组件模型生成的。要解决这个问题,您有两种选择:
      1. 使用@Mapper(componentModel = "spring")。我个人更喜欢这个选项,因为你独立于IDE。您还可以使用可以应用的@MapperConfig
      2. 使用注释选项配置IDE。对于IntelliJ,在Settings - &gt;中添加编译器参数。构建,执行,部署 - &gt;编译器 - &gt;注释处理器,有一个名为注释处理器选项的部分,其中添加mapstruct.defaultComponentModel作为选项名称,spring作为值。我不知道如何为Eclipse做这件事