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

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

经佐
2023-03-14
    null

我试图用另一个话题来做这件事,但对我来说不起作用。

这是我的mapstruct接口:

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

    @Override
    RisqueARS convertirBoVersDao(RisqueBO bo);
}

这是我的服务班:

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

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());
    }

}

共有1个答案

薄伟彦
2023-03-14

我的策略是

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

您的类将如下所示:

@Service public class ServiceRisqueImpl implements ServiceCRUD {

@Autowired
private RisqueRepository risqueRepo;

@Autowired
private RisqueBOConvertisseur risqueConv;

//...

@Mock
private RisqueRepository risqueRepo;

@Mock
private DossierInternetResource dossierInternet;

@Mock
private RisqueBOConvertisseur risqueConv;

@InjectMocks
ServiceRisqueImpl serviceRisque;
 类似资料:
  • 我正在使用MapStruct将对象从DTO映射到DTO。我的映射器依赖于一些服务/存储库来从数据库中获取数据,例如,从具有IDs列表的DTo映射到具有其他POJO列表的POJO。为此,我有一个Mapper inteface和一个抽象类Decorator来实现这个接口。我想测试映射器,但我需要模拟装饰器中的服务。我的问题是我怎样才能做到这一点? 现在我知道如果mapper没有那么多依赖项(SOLID

  • 问题内容: 我有一个Java命令行程序。我想创建JUnit测试用例以进行模拟。因为当我的程序运行时,它将进入while循环并等待用户输入。如何在JUnit中模拟呢? 问题答案: 从技术上讲,可以进行切换,但是总的来说,不直接在代码中调用它,而是添加一层间接层,这样输入源就可以从应用程序的某个位置进行控制,这样会更健壮。确切地讲,这是实现的详细信息-依赖项注入的建议很好,但是你不一定需要引入第三方框

  • 简介 在 Laravel 应用程序测试中,你可能希望「模拟」应用程序的某些功能的行为,从而避免该部分在测试中真正执行。例如:在控制器执行过程中会触发事件(Event),从而避免该事件在测试控制器时真正执行。这允许你在仅测试控制器 HTTP 响应的情况时,而不必担心触发事件。当然,你也可以在单独的测试中测试该事件逻辑。 Laravel 针对事件、任务和 Facades 的模拟,提供了开箱即用的辅助函

  • #使用Mocks测试 在现实世界的应用程序中,我们的组件很可能具有外部依赖性。当为组件编写单元测试时,如果我们可以模拟这些外部依赖性,以使我们的测试仅依赖于被测试组件的行为,这将是理想的。 vue-loader提供了一个特性,它允许你使用inject-loader向*.vue组件注入任意依赖项。一般的想法是,不是直接导入组件模块,我们使用inject-loader为该模块创建一个“模块工厂”函数。

  • 考虑为现有Azure Cosmos DB帐户启用地理冗余?但是如何模拟故障转移来进行测试呢 启用地理冗余后,考虑数据一致性有多重要? 一般性建议是什么 考虑地理冗余或数据一致性所需的任何代码更改?我们使用的是cosmosdb-sqlapi。

  • 问题内容: 我刚开始使用Node,现在正在编写一些单元测试。对于前几个函数,我可以正常运行,但是现在我碰到了一个包含其中的函数。我的函数的简化版本如下所示: 我尝试使用基本节点断言测试库进行测试: 由于执行此操作的时间(以及结果)总是不同的,因此它将始终失败。 在Python中,我可以设置模拟类和对象。有没有一种方法可以在Node中解决此问题而无需将moment.utc()作为函数的参数? 问题答