5

我正在使用一个使用 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

通过字段“customerMapper”表示的不满足的依赖关系

4

2 回答 2

1

我遵循了这个答案,我的问题很快就解决了,因为我在 build.gradle 文件中粘贴了建议的行

于 2018-02-05T11:43:34.797 回答
0

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

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

要排除可能性,请对每个执行以下操作:

  1. 确保将 IDE 配置为运行 APT。看看这里如何设置它。从 IDE 运行构建并检查是否生成了映射器类
  2. 如果有的话,它们很可能是使用默认组件模型生成的。要解决此问题,您有两种选择:
    1. 使用@Mapper(componentModel = "spring"). 我个人更喜欢这个选项,因为你是独立于 IDE 的。你也可以使用@MapperConfig你可以申请的
    2. 使用注释选项配置 IDE。对于 IntelliJ,在 Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors 中添加编译器参数,其中有一个名为 Annotation Processor Options 的部分添加mapstruct.defaultComponentModel为选项名称和spring值。我不确定如何为 Eclipse 做这件事
于 2017-06-04T07:11:41.507 回答