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

How to tests and mock mapstruct converter?

我在我的 java gradle 项目中使用了 mapstruct frameword,它工作得很好,但我只是想测试一下:

我尝试使用 an other topic to do this 但它对我不起作用。

这是我的 mapstruct 界面:

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

    @Override
    RisqueARS convertirBoVersDao(RisqueBO bo);
}

这是我的服务 class :

@服务 public class ServiceRisqueImpl 实现 ServiceCRUD {

@Autowired
private RisqueRepository risqueRepo;

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

private final String nomObjet = "RisqueARS";

public void setRisqueConv(RisqueBOConvertisseur risqueConv) {
    this.risqueConv = risqueConv;
}

@Autowired
private DossierInternetResource dossierInternet;

@Override
public RisqueBO recupererParId(String id) {
    // Récupère le bloc de la base de données
    final RisqueARS risqueDAO = risqueRepo.findOne(id);

    // Si aucun résultat -> on déclenche une exception
    if (null == risqueDAO) {
        // Déclenche une exception
        throw new ObjectNotFoundException(construireMessageErreur(this.nomObjet, "L'objet risque correspondant à l'id %s, n'existe pas.", id));
    }

    return risqueConv.convertirDaoVersBo(risqueDAO);
}

}

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

@RunWith(MockitoJUnitRunner.class)

@SpringBootTest(classes = {ServiceRisqueImpl.class, RisqueBOConvertisseurImpl.class, RisqueBOConvertisseur.class}) public class ServiceRisqueImplTest {

@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");
}

junitreturn我

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 测试生成的源转换器?

坦克!

我的策略是

  1. 在您的业务逻辑中模拟映射器并将其作为单独的组件进行测试。 MapStruct 可以生成 spring 注释。只需使用 @Mapper( componentModel = "spring" ) 让您的 DI 框架注入映射器。

您的 class 看起来像:

@Service public class ServiceRisqueImpl implements ServiceCRUD {

@Autowired
private RisqueRepository risqueRepo;

@Autowired
private RisqueBOConvertisseur risqueConv;

//...

和你对 ServiceRisqueImpl

的测试
@Mock
private RisqueRepository risqueRepo;

@Mock
private DossierInternetResource dossierInternet;

@Mock
private RisqueBOConvertisseur risqueConv;

@InjectMocks
ServiceRisqueImpl serviceRisque;
  1. 您现在还需要模拟映射器,但在这样做时,您可以更精细地控制调用映射器并使用其结果的业务逻辑。毕竟,您可以根据需要验证调用并模拟结果。

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

  3. 相同