2013-05-27 204 views
0

的方法如何测试这个方法:测试使用JUnit

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) { 
    } 
+2

通过在实例化语句并且不执行例外之后执行查询开始。 –

回答

1

一些建议,使这个更容易测试。

updateTable方法在这里做两件事。

  1. 执行查询,得到的结果
  2. 应用结果集表。

我会重构有两种方法。

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

用于上述两种方法书写测试应该简单。

+0

不是'public ResultSet getResultSetForQuery(String sql,Statement st)'这样的方法太原子化了,就像测试执行查询一样''select * from userDetails';'? – dantuch

+0

取决于是否为其编写测试增加了价值。那个测试会做什么? ?测试你的模式?或者测试你的数据库驱动 –

+0

测试我的数据库驱动程序 –

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 
    } 

} 
+0

作为设置,我会擦除表格并插入条目。这样你总是会用相同的数据集 – TecHunter

+0

好主意测试,我会做同样的事情 –

0

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

0

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

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

一般来说,在每种测试方法中,你都要这样做:执行一些代码,然后对你期望的情况做出断言。在我的例子中,我正在测试方法'myAdd',我期望1 + 1加起来有2个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

如果你想测试相对于它的depdencies某一类行为,一个模拟的框架建议。示例包括:jmock,mockito等