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

为javax . persistence . criteria . root创建模拟时JUnit测试失败的原因

公羊向荣
2023-03-14

我为下面的方法创建了一个模拟 junit 测试用例

方法:

@覆盖

公共列表检索ListByUserId(用户用户){

Session session = this.sessionFactory.getCurrentSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<CredentialDocments> criteria = builder.createQuery(CredentialDocments.class);
Root<CredentialDocments> credentialRoot = criteria.from(CredentialDocments.class);
criteria.select(credentialRoot).where(builder.equal(credentialRoot.get(USERS), users)).distinct(true);
criteria.orderBy(builder.desc(credentialRoot.get(PropertyConstant.UPLOADED_TS)));
return session.createQuery(criteria).getResultList();

}

测试用例:

包com . XYZ . Dao . test;

导入静态org.mockito.mockito.when;

进口java.util.ArrayList;进口java.util.List;

进口javax.persistence.criteria.CriteriaBuilder;

导入javax . persistence . criteria . criteria query;

导入javax . persistence . criteria . path;

进口javax.persistence.criteria.Root;

导入组织hibernate.Session;

进口org.hibernate.SessionFactory;

导入组织junit.Before;

导入组织junit.Test;

进口org.junit.jupiter.api.Assertions;

导入组织 junit.runner.RunWith;

进口org.mockito.InjectMocks;

进口org.mockito.Mock;

导入org . spring framework . test . context . JUnit 4 . spring runner;

@运行方式(SpringRunner.class)

公共类CredentialDocTest {

@InjectMocks
CredentialDocDAO credentialDocDAO = new CredentialDocDAOImpl();
@Mock
SessionFactory sessionFactory;
@Mock
Session session;
@Mock
CriteriaBuilder builder;
@Mock
CriteriaQuery<CredentialDocments> criteria;
@Mock
Root<CredentialDocments> credentialRoot;
@Mock
Path<Object> path;

private CredentialDocments credentialDocument;
private List<CredentialDocments> credentialDocumentList;

@Before
public void setUp() throws Exception {
    credentialDocument = new CredentialDocments();
    credentialDocumentList = new ArrayList<>();

    credentialDocument.setDocId(1);
    credentialDocument.setDocNm("Doc1");
    Users users = new Users();
    users.setUserId("jscrotestpi");
    credentialDocument.setUsers(users);

    credentialDocumentList.add(credentialDocument);
    when(sessionFactory.getCurrentSession()).thenReturn(session);
    when(session.getCriteriaBuilder()).thenReturn(builder);
    when(builder.createQuery(CredentialDocments.class)).thenReturn(criteria);
    when(criteria.from(CredentialDocments.class)).thenReturn(credentialRoot);
}

@Test
public void testRetrieveListByUserId() {
    criteria.select(credentialRoot);
    when(credentialRoot.get("users")).thenReturn(path);
    criteria.where(builder.equal(credentialRoot.get("users"), credentialDocument.getUsers())).distinct(true);
    credentialDocDAO.retrieveListByUserId(credentialDocument.getUsers());
    List<CredentialDocments> actualCredentialDocList = session.createQuery(criteria).getResultList();
    Assertions.assertEquals(credentialDocumentList, actualCredentialDocList);
    Assertions.assertEquals(1, actualCredentialDocList.size());
}

}

当我执行上述测试用例时,Nullpointer Exception正在为credentialRoot抛出。在下面的行criteria.where(builder.equal(credentialRoot.get(“用户”),credential/Document.getUsers()))中获取(“用户“)。distinct(true);

你能帮我们解决这个问题吗。提前谢谢。

共有1个答案

鲜于德泽
2023-03-14

当一个mock返回一个返回mock的mock时,对我来说,要么是实现设计不好,要么是测试设计不好(或两者兼而有之)。您的测试用例不会测试您的组件应该具有的行为或契约,而是会确认代码没有有效地测试任何内容。

如果您决定不使用标准API,而是使用 JPQL,该怎么办?合同不会改变,方法应该恢复列表用户Id应该返回完全相同的东西。如果是这样,则测试也不应更改。但是您将不得不重写它,因为那里不再有标准API。那你会嘲笑什么呢?这很糟糕。

您的案例是可以使用inmemory数据库测试存储库合同而不是其实现的完美示例。

正如您现在所看到的,测试本身和测试中模拟的实现比测试组件本身更复杂,甚至无法按预期工作 - 现在您必须调试测试场景和模拟,这很糟糕。

 类似资料:
  • 考虑一个maven实用工具模块(模块1),它定义了一个抽象类:AbstractFoo.java。在测试资源下,编写了所述类的模型:foomockup.java。还编写了一个测试类:AbstractFootest.java。 现在考虑第二个模块(模块2),它包含一个使用AbstractFoo的类,并声明测试用例:bar.java和bartest.java。java在创建Bar实例的同时创建FooMo

  • 本节介绍与JUnit Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 JUnit Mock Test I 问题1 - 以下哪项描述正确测试? A - 测试是检查应用程序功能的过程,是否按照要求运行。 B - 测试是单个实体(类或方法)的测试。 C - 以上两者。 D - 以上都

  • 我想学习如何编写JUnit测试,但我完全失败了。 这是我的测试: 问题是这个简单的断言已经失败了。返回的列表是空的。我知道,我对这一切都不熟悉,但是从我的角度来看,失败是如此出乎意料,以至于我没有办法解决这个问题。 以下是全部代码(不太多): 要测试的功能就是这个,我知道它是有效的: 实际上,我只是想学习如何编写这样的测试,但是几天来我一直没有写出来。有相当多的例子和解释,但是不管我做什么尝试,我

  • 我有一个简单的测试用例: FileManager中的函数删除 /myDir下的所有文件,然后再次保留文件。 如上所述,我有一个。运行时,我可以按以下顺序查看所有打印: 但是,测试在失败。有两件事我不明白: > 我不明白,它在中失败了,为什么我仍然可以看到打印的,听起来就像是失败了,它没有停止运行,而是继续运行下一个测试?JUnit测试用例中的场景背后发生了什么?? 我不明白的另一件事是为什么tes

  • 首先请原谅我可能的无知,专业的做事方式对我来说很新鲜,如果有什么我没有提到的,请告诉我,我会尽力给你你需要的信息。。。 所以我试图用maven在Eclipse中构建我的webapp,我有一个测试套件 这很好,当我右键单击并以Junit test运行测试时,所有测试都通过了。 当我以Maven build的形式运行它,并以打包一系列测试为目标时,失败了??? 我的maven surefire插件配置