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

Spring:如何在容器外对DAO进行单元测试,而不获得EntityManger的NullPointerException?

萧飞
2023-03-14

我上了两节课。BatchDao和BatchDaoImpl。BatchDao是一个接口,BatchDaoImpl包含逻辑。你知道规则的。

我对Spring很陌生,这给我带来了一个问题。我如何在不使用容器的情况下对包含在里面的方法进行单元测试?通常情况下,我会像编写JUnit中的POJO一样编写我的方法,然后就这样结束了,就像我在大学时所做的那样。

public interface BatchDao {

   public List<Batch> get_qry_Batch(ParameterBeanPost paramBean, QueryTableFields qrytblfields);
   public QueryTableFields get_Query_TableFields(String qry_id);
}

BatchDaoImpl的代码:

public class BatchDaoJPA2Impl implements BatchDao {

    @PersistenceContext(unitName="myPersistence")
    private EntityManager entityManager;
    //...lots of other variables

    //...lots of other logic...

    //Finally, we get to the method that thorws the NullPointerException

    public QueryTableFields get_Query_TableFields(String qry_id)
    {
        try {                                       
            String qlString = "SELECT p FROM QueryTableFields p WHERE p.qry_id = ?1";

            // The next line is what throws the NullPointerException            
            TypedQuery<QueryTableFields> query = entityManager.createQuery(qlString, QueryTableFields.class);

            int param1 = Integer.parseInt(qry_id);
            query.setParameter(1, (param1));
            System.out.println("About to Execute the QueryTable");
            return query.getSingleResult();

        } catch (NoResultException e) {
            // TODO Auto-generated catch block
            System.out.println("No Result from QueryTable");
            return null;

        }


}

JUnit测试的代码:

import com.every.package.ever

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:/spring/applicationContext.xml")
public class BatchDaoJPA2ImplJUnitTest {


    @Mock
    private EntityManager entityManager;

    BatchDaoJPA2Impl myBDI = new BatchDaoJPA2Impl();


    @Test
    public void testGet_Query_TableFields() {   

        QueryTableFields myQTFs = myBDI.get_Query_TableFields(null);

        //Should just comeback with empty strings and not null.
        assertNotNull(myQTFs);
    }

}

共有1个答案

利永年
2023-03-14

@mock只是一个注释,它本身没有任何行为。实际使用mock填充这些字段的行为可能来自以下两种情况之一

  • 使用MockitoAnnotations.initMocks()将解析类,并为每个用@mock
  • 注释的字段创建一个模拟
  • @runwith语句中使用mockitojunitrunner而不是springjunit4classrunner
    • 如果使用Spring runner进行其他行为,您可能不想这样做

    因此,只需在@before方法中添加mockitoannotations.initmocks(this),您就会开始嘲弄EntityManager,而不是让它为null

    如果您想注入一个实际的EntityManager,可能会比较困难。然而,这不在你的问题范围之内,因为你问的是如何嘲弄它。关于这个问题,请参见:如何测试Spring数据存储库?这是:Spring无法注入实体管理器工厂

 类似资料:
  • 问题内容: 我有几个DAO对象,这些对象用于从数据库中检索信息,我 确实 想为它们编写一些自动化测试,但是我很难弄清楚该怎么做。 我正在使用Spring 来运行实际查询(通过准备好的语句)并将结果映射到模型对象(通过类)。 如果要编写单元测试,则不确定如何/应该模拟对象。例如,由于只有读操作,因此我将使用实际的数据库连接,而不模拟jdbcTemplate,但我不确定那是正确的。 这是批处理中最简单

  • 我试图使用spring security和一个简单的home(root)控制器在spring-boot中运行单元测试,该控制器使用thymeleaf进行模板处理。我正在尝试编写一些单元测试,以验证我的安全权限是否正常工作,以及正确的数据是否隐藏或显示在我的模板(使用thymeleaf Spring Security集成)中。当我运行它时,应用程序本身确实可以正常工作。我只想通过一组集成测试来验证它

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。

  • 单元测试,对独立的代码功能片段,由编写代码的团队进行测试,也是一种编码,而非与之不同的一些事情。设计代码的一部分就是设计它该如何被测试。你应该写一个测试计划,即使它只是一句话。有时候测试很简单:“这个按钮看起来好吗?”,有时候它很复杂:“这个匹配算法可以精确地返回正确的匹配结果?”。 无论任何可能的时候,使用断言检查以及测试驱动。这不仅能尽早发现 bug,而且在之后也很有用,让你在其他方面担心的谜