当前位置: 首页 > 知识库问答 >
问题:

Mapstruct抽象映射器无法在单元测试中模拟组件

卓俊晖
2023-03-14

使用MapStruct,我创建了一个映射器,它是一个抽象类。我决定将映射器从接口转换为抽象,以便使用组件名称AddressConverter,该组件本身使用名为CountryService的组件。

尽管映射工作正常,但在单元测试中,它会抱怨组件addressconverter找不到合格bean。

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mind.microservice.mapper.converter.AddressConverter' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1509)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
    ... 42 more

映射器类。我尝试在@mapper注释的use属性中添加addressconverter。但是异常移到了addressconverter的下一个组件。

@Mapper(componentModel = "spring", uses = {
        GenericMapper.class,
        Size.class
})
public abstract class StudentMapper{

    @Autowired
    private AddressConverter addressConverter;

    @Mappings({
            @Mapping(target = "address", source = "student", qualifiedByName = "formatAddress"),
    })
    public abstract StudentEntity map(Student student);

    @Named("formatAddress")
    public String formatAddress(Student student){
        return this.addressConverter.buildAddress(student);
    }
    
}

AddressCoverter

@Component
@AllArgsConstructor
public class AddressConverter {

    private final CountryService countryService;

    public String buildAddress(Student student){
        return this.countryService.countryFormatter(student.getCountry); 
    }
}

出现异常的测试类。正如我提到的,我尝试将AddressConverter添加到ContextConfiguration。我还尝试通过添加injectmocks来完全模仿它。

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {
        GenericMapper.class,
        Size.class
})
public class StudentMapperTest{

    @Autowired
    private StudentMapper MAPPER;
     
    //also @Autowired was used and also I removed it completely, still the same exception
    @InjectMocks 
    private AddressConverter addressConverter;

    @Test
    public void testStudentToStudentEntityMapping() {
        Student randomStudent = ObjectHandler.random(Student.class);

      //...the rest of the test but it doesn't even enter, so it doesn't affect the outcome.
   }
 
}

共有1个答案

李洋
2023-03-14

我相信您需要用@mockbean更改@injectmock

 类似资料:
  • 使用@SpringBootTest,据我所知,Spring实际上是在启动应用程序,并且应该创建映射器类,所以我不明白,为什么映射器总是空?!当我删除@SpringBootTest中的DummyMapper.class时,会出现一个错误,上面写着“Failed to load application Context”。这向我表明,映射器是被识别的。 我觉得奇怪的另一件事是,我必须在映射器中使用“un

  • 我使用的是一个用MapStruct生成的映射器: 缺省组件模型是spring(在pom.xml中设置)

  • 我正在尝试使用MockMvc和mockito为应用程序中的rest控制器类编写单元测试。我有一个实体类的DTO类,我给出它作为controller方法的输入。controller方法将此DTO对象映射到entity类中,并使用my service类持久化它。持久化之后,通过映射service类的方法返回的对象来创建一个新的DTO类,并在ResponseEntity对象中返回这个DTO。在我的单元测

  • 我试图用为MapStruct映射器编写单元测试。 单元测试类: 任何帮助都将不胜感激。

  • 我有一个用户的Entity-DTO转换器,如下所示: 我有很多Entity-DTO要管理,所以我想像这样抽象转换器 我的问题是:我必须放置什么而不是???

  • 我正在使用MapStruct,mapstruct-jdk8版本1.1.0.final并定义我通过spring注入的抽象类。 我正在研究如何能够通过Junit测试来测试它们?我有一个基本的主映射器,它将使用2个子映射器 我尝试了几种方法,但无法正确实例化映射器来测试它。 java.lang.RuntimeException:java.lang.ClassNotFoundException:找不到Co