0

我该如何测试这种方法:

public void updateTable() {                 
    try {
        String sql = "select * from userDetails";
        rs = st.executeQuery(sql);
        st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        table.setModel(DbUtils.resultSetToTableModel(rs));  
    }
    catch(Exception e) {
    }
4

4 回答 4

1

很少有建议可以使这更可测试。

updateTable方法在这里做两件事。

  1. 执行查询并获取结果
  2. 将结果集应用于表。

我会重构有两种方法。

  1. public ResultSet getResultSetForQuery(String sql,Statement st)
  2. public Table updateTable(ResultSet rs)

为上述两种方法编写测试应该很简单。

于 2013-05-27T06:11:43.150 回答
0

有很多 java 库可用于模拟大数据以帮助测试与数据库相关的方法。例如 Mockito / EasyMock / JMock等等。您可以使用这些库。您可以使用这些工具模拟预期结果,并且可以使用预期结果测试您的方法。

于 2013-05-27T07:20:04.433 回答
0

JUnit:通常,您编写如下所示的测试类,并使用 @Test 注释包含您测试的方法。如果你想编写一个必须失败的测试,你可以使用注解的 'expected' 属性。如果您知道您的测试可能运行时间过长并希望它在一段时间后超时,请使用注释中的“超时”属性。

如果您在每个测试方法之前都有特定的初始化逻辑,则将其放入另一个方法并使用 @Before 注释该方法。同样,要释放东西,您可以使用@After。对于每个测试类运行一次的初始化,使用注释@BeforeClass 并确保该方法是公共的和静态的 - 与@AfterClass 相同。

一般来说,在每个测试方法中,你都这样:执行你的一些代码,然后对你期望的情况做出断言。在我的示例中,我正在测试方法“myAdd”,我希望 1+1 加起来等于两个 2。

public class MyTest {
  @Test
  public void testAddition() {
    int sum = myAdd(1, 1);
    assertEquals(2, sum);
  }
}

这个例子是基于JUnit的:https ://github.com/junit-team/junit/wiki 还有替代方案,比如TestNG:http ://testng.org/doc/index.html

如果您想测试某个类与其依赖关系相关的行为,建议使用模拟框架。示例包括:jmock、mockito 等

于 2013-05-27T07:32:14.680 回答
0

任何好的测试都有两个要点:

  1. 检查它是否运作良好
  2. 本地化错误(如果存在)

检查它是否正常工作如果存在错误则将其定位在您的情况下,如果错误存在,我们无法执行如此好的测试来定位错误,因为您的方法工作过于复杂。将您的方法重构为几种方法以使其更具可读性和可测试性会很好。我同意@AjayGeorge 关于分离该方法的方式。

然后你可以写如下内容:

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import java.sql.ResultSet;

public class TestExample {

    @BeforeClass
    public static void setup() {
        // init your connection here
        // and insert data for tests
    }

    @AfterClass
    public static void cleanup() {
        // close connection
    }

    @Test
    public void testTableUpdate() {

        // initialize 'sqlQuery' and 'statement'

        ResultSet resultSet = getResultSetForQuery(sqlQuery, statement);

        // check 'resultSet' with JUnit methods like assertTrue

        updateTable(resultSet);

        // check that table is filled as you expected
    }

}
于 2013-05-27T06:42:25.403 回答