Java 如何测试和模拟mapstruct转换器?

Java 如何测试和模拟mapstruct转换器?,java,junit,mockito,mapstruct,Java,Junit,Mockito,Mapstruct,我在java gradle项目中使用mapstruct frameword,它工作得非常好,但我只想测试: mapstruct生成的源(转换器) 服务类(调用mapstrcut转换器) 我尝试过使用它,但它对我不起作用 这是我的mapstruct界面: @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface RisqueBOConvertisseur extends BOConvertisseur<

我在java gradle项目中使用mapstruct frameword,它工作得非常好,但我只想测试:

  • mapstruct生成的源(转换器)
  • 服务类(调用mapstrcut转换器)
我尝试过使用它,但它对我不起作用

这是我的mapstruct界面:

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface RisqueBOConvertisseur extends BOConvertisseur<RisqueARS, RisqueBO> {
    @Override
    RisqueBO convertirDaoVersBo(RisqueARS dao);

    @Override
    RisqueARS convertirBoVersDao(RisqueBO bo);
}
}

当我尝试测试我的服务时:

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest(类={ServiceRisqueImpl.class,RisqueBOConvertisseurImpl.class,RisqueBOConvertisseur.class}) 公共类服务请求测试{

@Mock
private RisqueRepository risqueRepo;

@InjectMocks
ServiceRisqueImpl serviceRisque;

@Mock
private DossierInternetResource dossierInternet;

@Mock
private RisqueBOConvertisseur risqueConv;

@Before
public void initMocks() {
    MockitoAnnotations.initMocks(this);
    serviceRisque.setRisqueConv(risqueConv);
}

@Test(expected = ObjectNotFoundException.class)
public void testRecupererParIdQuandIdInconnu() {
    // INITIALISATION
    // Mock la méthode DAO de retour des données en base
    when(risqueRepo.findOne(anyString())).thenReturn(null);

    // PROCESSUS
    serviceRisque.recupererParId("5");
}
少年把我还给我

However the constructor or the initialization block threw an exception : java.lang.ClassNotFoundException: Cannot find implementation for ***.convertisseur.RisqueBOConvertisseur
我的转换器测试有相同的错误:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {RisqueBOConvertisseur.class, RisqueBOConvertisseurImpl.class})
public class RisqueBOConvertisseurTest {

    @Autowired
    private RisqueBOConvertisseur configurationMapper;

    private final RisqueBOConvertisseur risqueConv = Mappers.getMapper(RisqueBOConvertisseur.class);

    @Test
    public void test() {
        // INITIALISATION
        final RisqueBO risqueBO = new RisqueBO("950095f7-62e7-42e5-a5ae-0d7292e7ad00", "D1", ProfilEpargnant.PROFIL_EPARGNANT_SECURISE,
                ComportementFaceRisques.REACTION_BAISSE_MARCHE_PANIQUE);

        // PROCESSUS
        // final RisqueARS risqueARS =
        // RisqueBOConvertisseur.INSTANCE.convertirBoVersDao(risqueBO);

        final RisqueARS risqueARS = configurationMapper.convertirBoVersDao(risqueBO);

        // VERIFICATIONS
        assertEquals(risqueBO.getIdRisque(), risqueARS.getIdRisque());
        assertEquals(risqueBO.getIdDossierInternet(), risqueARS.getIdDossierInternet());
        assertEquals(risqueBO.getCodeComportementRisque(), risqueARS.getCodeComportementRisque());
        assertEquals(risqueBO.getCodeProfilEpargnant(), risqueARS.getCodeProfilEpargnant());
    }

}
如何使用mapStruct测试生成的源代码转换器


坦克!

我的策略是

  • 在业务逻辑中模拟映射器,并将其作为单独的组件进行测试。MapStruct可以生成spring注释。只需使用
    @mapper(componentModel=“spring”)
    让DI框架注入映射器
  • 你的班级看起来像:

    @Service公共类ServiceRisqueImpl实现ServiceCRUD{
    @自动连线
    私人危机定位危机;
    @自动连线
    私人RisqueBOConvertisseur risqueConv;
    //...
    
    以及您对
    ServiceRisqueImpl

    @Mock
    私人危机定位危机;
    @嘲弄
    私人档案资源档案网;
    @嘲弄
    私人RisqueBOConvertisseur risqueConv;
    @注射模拟
    ServiceRisqueImpl serviceRisque;
    
  • 您现在也需要模拟映射器,但在这样做时,您可以对调用映射器并使用其结果的业务逻辑进行更细粒度的控制。毕竟,您可以验证调用并以自己喜欢的方式模拟结果

  • 您需要为映射器添加一个单独的测试,并测试映射逻辑。我通常使用往返映射:
    in->map->reverseMap->out
    ,并使用assertj属性断言查看
    in
    是否与
    out
    相同

  • @RunWith(SpringRunner.class)
    @SpringBootTest(classes = {RisqueBOConvertisseur.class, RisqueBOConvertisseurImpl.class})
    public class RisqueBOConvertisseurTest {
    
        @Autowired
        private RisqueBOConvertisseur configurationMapper;
    
        private final RisqueBOConvertisseur risqueConv = Mappers.getMapper(RisqueBOConvertisseur.class);
    
        @Test
        public void test() {
            // INITIALISATION
            final RisqueBO risqueBO = new RisqueBO("950095f7-62e7-42e5-a5ae-0d7292e7ad00", "D1", ProfilEpargnant.PROFIL_EPARGNANT_SECURISE,
                    ComportementFaceRisques.REACTION_BAISSE_MARCHE_PANIQUE);
    
            // PROCESSUS
            // final RisqueARS risqueARS =
            // RisqueBOConvertisseur.INSTANCE.convertirBoVersDao(risqueBO);
    
            final RisqueARS risqueARS = configurationMapper.convertirBoVersDao(risqueBO);
    
            // VERIFICATIONS
            assertEquals(risqueBO.getIdRisque(), risqueARS.getIdRisque());
            assertEquals(risqueBO.getIdDossierInternet(), risqueARS.getIdDossierInternet());
            assertEquals(risqueBO.getCodeComportementRisque(), risqueARS.getCodeComportementRisque());
            assertEquals(risqueBO.getCodeProfilEpargnant(), risqueARS.getCodeProfilEpargnant());
        }
    
    }