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

如何为spring注入的mapstruct抽象映射器编写Junit测试

卫景明
2023-03-14

我正在使用MapStruct,mapstruct-jdk8版本1.1.0.final并定义我通过spring注入的抽象类。

我正在研究如何能够通过Junit测试来测试它们?我有一个基本的主映射器,它将使用2个子映射器

@Mapper(componentModel = "spring", uses = {SubMapper1.class, SubMapper2.class})
public abstract class MainMapper {

  @Mapping(target = "field1", qualifiedByName = {"MyMapper2Name", "toEntity"})
  public abstract MyEntity toEntity(MyDto pDto);

  public MyDto fromEntity(MyEntity pEntity) {
     // Specific code, hence why I use Abstract class instead of interface. 
  }
}

我尝试了几种方法,但无法正确实例化映射器来测试它。

@RunWith(SpringRunner.class)
public class MainMapperTest {

    private MainMapper service = Mappers.getMapper(MainMapper.class);

    @Test
    public void testToEntity() throws Exception {
.....

java.lang.RuntimeException:java.lang.ClassNotFoundException:找不到Com.Mappers.MainMapper的实现

我也试过通过@injectmock,但也没有骰子。

无法实例化名为“service”的@InjectMocks字段。您没有在字段声明中提供实例,所以我尝试构造实例。但是,我失败了,因为:类型'MainMapper是一个抽象类。

通过spring@AutoWired

原因:org.springframework.beans.factory.noSuchBeanDefinitionException:没有“com.mappers.mainmapper”类型的合格bean可用:应至少有一个合格的自动候选bean。依赖项注释:{@org.SpringFramework.Beans.Factory.Annotation.AutoWired(required=true)}

我猜这可能与注释处理器和映射器没有在我启动测试时生成有关。我找到了这个类作为示例。

然而,类注释ProcessorTestRunner似乎在1.2之前还不能使用,它还没有最终版本。

所以我的问题是我如何编写Junit测试来测试我的mapstruct抽象类映射器,我在代码中通过spring注入使用它。

共有2个答案

漆雕唯
2023-03-14

您有多个问题:

  1. 您应该只将映射器#getMapper(Class)与默认的ComponentModel一起使用,否则将无法正确实例化映射器。如果您在那里获得runtimeexception,则表示未生成实现类。确保有正确的设置
  2. 您需要针对实现MainMapperImpl而不是针对抽象类进行测试。
  3. 如果要使用spring bean进行测试,则需要使用正确的componentscan并确保实现和使用的映射器可以自动连线。

您链接的类是一个错误的测试类,并且与您的测试用例不相关。看一下这个用于spring集成的集成测试用例。

AnnotationProcessorTestRunner是我们测试的一部分,用于测试注释处理器,并且从一开始就存在。它不是发行版的一部分。

鲁羽
2023-03-14

针对@Richard Lewan的评论,下面是我如何使用2个子映射器为抽象类ConfigurationMapper声明测试类的

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ConfigurationMapperImpl.class, SubMapper1Impl.class, SubMapper2Impl.class})
public class ConfigurationMapperTest {

您在SpringBootTest注释中使用IMPL生成的类,然后注入要测试的类:

@Autowired
private ConfigurationMapper configurationMapper;

如果你需要更多的信息,让我知道,但从那里它是直接的。我没有模拟子映射器,因为我最好一次测试所有的映射过程。

 类似资料: