如何测试使用Junit在数据库中插入记录的void方法?

问题描述 投票:0回答:2

我有一个方法调用另一个方法来检索数据并将其插入数据库,我如何在Junit中测试此方法,因为此方法没有检索任何内容?任何人都可以提供一些这种情况的例子吗?

public static void method(){ 
    User user = getUser();  
    try {
        String Query = "INSERT INTO users (USER_ID , Name) VALUES ("
         +user.getID()+","+user.getName()+")";

        Statement statement = conn.createStatement();
        statement.executeUpdate(Query);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我正在考虑为用户使用模拟对象,但我不知道如何检查用户是否插入到数据库中。请帮忙。

java mysql unit-testing testing junit
2个回答
1
投票

这里有一些指针,但在此之前,你必须确定测试中的代码是什么。我说这个的原因是因为这实际上会让你重构代码。

例如,对于以下代码:

public static void method(){ 
    User user = getUser();  
    try {
        String query = "INSERT INTO users (USER_ID , Name) VALUES ("
         +user.getID()+","+user.getName()+")";

        Statement statement = conn.createStatement();
        statement.executeUpdate(query);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

你可能想测试以下内容: -

  1. 是否正确创建了查询字符串,即预期的有效SQL?
  2. 该方法是否应该抛出异常,因为我们想要捕获所有已检查的异常?
  3. 工作完成后,所有资源都将关闭?例如在您的方法连接打开但从未关闭。

现在,出于以上几点,可能存在一些具有更高重要性的点,例如确保正确构建查询。

因此,为此,应该从此方法中提取查询构建器代码,现在您可以在单独的单元测试中轻松测试此查询。

同样,您希望确保在作业完成后关闭连接。因此,您可能希望将此代码提取到接受查询作为参数的方法,打开连接,执行DB CRUD关闭连接并返回输出。并确保您不会在不同的方法中一直重复此代码。

现在,让我们去指点: -

  1. 如果您在任何时候认为某个方法中有一些代码是不可测试的,直到该代码成为该方法的一部分。请将其拉出到公共/私人方法并进行测试。
  2. 永远不要尝试将数据库持久性作为unit test的一部分进行测试。数据库驱动程序等已经拥有自己的测试并且已在全球范围内使用。
  3. 如果你认为your method需要进行测试是否被调用的次数是多少次(it's what you want to test)。它被称为interaction based testing

您可以使用mocking(Mockito)并删除测试中的方法,然后断言应该调用该方法的次数。请参阅thisthis链接。

希望能帮助到你!


0
投票

应根据预期行为测试类。 在这里测试返回类型(即使它有其他东西作为void)没有任何意义。

您的方法执行SQL查询。 因此,您的单元测试必须声明对数据库的预期副作用:具有预期值的插入。 请注意,要进行可重现且快速的测试,您应该支持嵌入式数据库进行单元测试。

© www.soinside.com 2019 - 2024. All rights reserved.