Как проверить и смоделировать конвертер mapstruct? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую mapstruct frameword в своем java проекте gradle, и он отлично работает, но я просто хочу проверить:

  • генерируемые mapstruct источники (конвертер)
  • класс обслуживания (вызов конвертер mapstrcut)

Я пытаюсь использовать другой топи c, чтобы сделать это , но он не работает для меня.

Это мой интерфейс mapstruct :

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

    @Override
    RisqueARS convertirBoVersDao(RisqueBO bo);
}

Это мой класс обслуживания:

@ Service publi c Класс 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}) publi c class ServiceRisqueImplTest {

1028 * Junit верните мне
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 Ответ

1 голос
/ 04 апреля 2020

Моя стратегия заключается в том, чтобы

  1. смоделировать маппер в вашей бизнес-логике c и протестировать его как отдельный компонент. MapStruct может генерировать весенние аннотации. Просто используйте @Mapper( componentModel = "spring" ), чтобы позволить вашей DI-структуре внедрить маппер.

Ваш класс будет выглядеть так:

@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;

Теперь вам также нужно будет смоделировать маппер, но при этом вы получите гораздо более детальный контроль над бизнес-логикой c, которая вызывает маппер и использует его результат. В конце концов, вы можете проверить вызов и смоделировать результат так, как вам нравится.

И вам нужно добавить отдельный тест для вашего картографа и протестировать логическую схему отображения c. Обычно я выполняю отображение в обе стороны так: in -> map -> reverseMap -> out и использую утверждение свойства assertj, чтобы увидеть, совпадает ли in с out.

...