如何测试和模拟 mapstruct 转换器?
How to tests and mock mapstruct converter?
我在我的 java gradle 项目中使用了 mapstruct frameword,它工作得很好,但我只是想测试一下:
- mapstruct 生成的源(转换器)
- 服务class(调用mapstrcut转换器)
我尝试使用 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 测试生成的源转换器?
坦克!
我的策略是
- 在您的业务逻辑中模拟映射器并将其作为单独的组件进行测试。 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;
您现在还需要模拟映射器,但在这样做时,您可以更精细地控制调用映射器并使用其结果的业务逻辑。毕竟,您可以根据需要验证调用并模拟结果。
并且您需要为您的映射器添加一个单独的测试并测试映射逻辑。我通常这样往返映射:in -> map -> reverseMap -> out
并使用 assertj 属性 断言来查看 in
是否与 out
.
相同
我在我的 java gradle 项目中使用了 mapstruct frameword,它工作得很好,但我只是想测试一下:
- mapstruct 生成的源(转换器)
- 服务class(调用mapstrcut转换器)
我尝试使用 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 测试生成的源转换器?
坦克!
我的策略是
- 在您的业务逻辑中模拟映射器并将其作为单独的组件进行测试。 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;
您现在还需要模拟映射器,但在这样做时,您可以更精细地控制调用映射器并使用其结果的业务逻辑。毕竟,您可以根据需要验证调用并模拟结果。
并且您需要为您的映射器添加一个单独的测试并测试映射逻辑。我通常这样往返映射:
in -> map -> reverseMap -> out
并使用 assertj 属性 断言来查看in
是否与out
. 相同