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

时间:2018-03-04 17:46:07

标签: java mysql unit-testing testing junit

我有一个方法调用另一个方法来检索数据并将其插入到数据库中,如何在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();
    }
}

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

2 个答案:

答案 0 :(得分: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. 工作完成后,所有资源都会关闭?例如在您的方法连接中打开但从未关闭。

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

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

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

    现在,让我们转到指针: -

    1. 如果你在任何一点上认为方法中有一些代码是不可测试的,直到该代码成为方法的一部分。请将其拉出公共/私人方法并进行测试。

    2. 永远不要尝试将数据库持久性作为unit test的一部分进行测试。数据库驱动程序等已经拥有自己的测试并且已在全球范围内使用。

    3. 如果您认为需要测试your method是否按预期调用次数(it's what you want to test)。它被称为interaction based testing

    4. 你可以使用mocking(Mockito)并将测试中的方法存根,然后断言应该调用该方法的次数。请参阅thisthis链接。

      希望它有所帮助!

答案 1 :(得分:0)

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

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