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

joh*_*col 5 spring unit-testing dependency-injection mapstruct

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

@Mapper
public interface CustomerMapper {
   Customer mapBankCustomerToCustomer(BankCustomerData bankCustomer);
}
Run Code Online (Sandbox Code Playgroud)

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

<compilerArg>-Amapstruct.defaultComponentModel=spring</compilerArg>
Run Code Online (Sandbox Code Playgroud)

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

@Autowired
private CustomerMapper customerMapper;
Run Code Online (Sandbox Code Playgroud)

但是当我运行涉及@SpringBootTest 的单元测试时

@SpringBootTest
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
public class SomeControllerTest {

    @Mock
    private SomeDependency someDependency;

    @InjectMocks
    private SomeController someController;

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

}
Run Code Online (Sandbox Code Playgroud)

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

通过字段“customerMapper”表达的不满意依赖

Fil*_*lip 0

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

  1. Eclipse 或 IntelliJ 正在选择注释处理器,您需要正确设置它们。
  2. Eclipse 或 IntelliJ 不从 Maven 编译器获取编译器选项

要排除这些可能性,请对每种情况执行以下操作:

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