【问题标题】:Cannot inject MapStruct mapper into spring-boot JUnit test无法将 MapStruct 映射器注入 spring-boot JUnit 测试
【发布时间】:2018-06-19 00:19:43
【问题描述】:

我正在尝试使用 componentModel="spring" 为 MapStruct 映射器编写单元测试。

应用程序运行良好,包括映射器注入。 问题是映射器没有注入测试类,我收到以下错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.onap.sdc.workflow.api.mapping.WorkflowMapperTest': Unsatisfied dependency expressed through field 'workflowMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.onap.sdc.workflow.services.mappers.WorkflowMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我正在使用 intellij IDEA,并且标记了 target\generated-sources。

这是映射器类:

@Mapper(componentModel = "spring")
public interface WorkflowMapper {

@Mapping(source = "properties", target = "category", qualifiedByName = "propertiesToCategoryMapper")
Workflow itemToWorkflow(Item item);

@Mapping(source = "category", target = "properties", qualifiedByName = "categoryToPropertiesMapper")
@InheritInverseConfiguration
Item workflowToItem(Workflow workflow);

@Named("propertiesToCategoryMapper")
default String customPropertiesToCategoryMapper(Map<String, Object> properties) {
    return String.class.cast(properties.get(WorkflowProperty.CATEGORY));
}

@Named("categoryToPropertiesMapper")
default Map<String, Object> customCategoryToPropertiesMapper(String category) {
    return Collections.singletonMap(WorkflowProperty.CATEGORY, category);
}

我在下面的代码 sn-p 中使用了这个映射器:

@Service("workflowManager")
public class WorkflowManagerImpl implements WorkflowManager {

private WorkflowMapper workflowMapper;

@Autowired
public WorkflowManagerImpl(WorkflowMapper workflowMapper) {
    this.workflowMapper = workflowMapper;
}

...some code

单元测试类:

@ContextConfiguration(classes = 
WorkflowMapperTest.WorkflowMapperSpringTestConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class WorkflowMapperTest {

@Configuration
@ComponentScan(basePackageClasses = WorkflowMapperTest.class)
public static class WorkflowMapperSpringTestConfig { }

@Autowired
WorkflowMapper workflowMapper;

@Test
public void shouldMapItemPropertyToWorkflowCategory() {
    ...some code...
}

任何帮助将不胜感激。

【问题讨论】:

    标签: java spring-boot mapstruct


    【解决方案1】:

    一目了然,您没有将要测试的 bean 包含在组件扫描中。

    您需要更新您的 @ComponentScan 配置以包含它。

    @ComponentScan(basePackageClasses = {WorkflowMapperTest.class,
                                         WorkflowMapper.class,
                                         WorkflowMapperImpl.class})
    

    【讨论】:

    • 非常感谢。我刚刚添加了 WorkflowMapper.class 并且它完成了工作。为什么要添加 WorkflowMapperImpl.class?你觉得我也需要吗?
    • 如果您不更改生成的映射器的包,那么仅包含 WorkflowMapper 就足够了
    猜你喜欢
    • 2023-01-15
    • 1970-01-01
    • 2017-11-03
    • 2017-12-29
    • 2021-01-04
    • 2019-05-05
    • 2020-10-24
    • 2021-11-19
    • 2017-10-30
    相关资源
    最近更新 更多