返回void的测试方法

时间:2014-02-22 11:00:47

标签: java testing jdbc

我有一个void方法,我想测试它。我怎么做? 这是方法:

public void updateCustomerTagCount() {

    List<String> fileList = ImportTagJob.fetchData();
    try {
        for (String tag : fileList) {
            Long tagNo = Long.parseLong(tag);
            Customer customer = DatabaseInterface.getCustomer(tagNo);
            customer.incrementNoOfTimesRecycled();
            DatabaseInterface.UpdateCustomer(customer);  
        }
    } catch(IllegalArgumentException ex) {
        ex.printStackTrace();
    }

}

2 个答案:

答案 0 :(得分:0)

当方法返回void时,无法测试方法输出。相反,您必须测试该方法的预期后果。例如:

public class Echo {
    String x;
    public static void main(String[] args){ 
        testVoidMethod();
    }

    private static void testVoidMethod() {
        Echo e = new Echo();
        //x == null
        e.voidMethod("xyz");
        System.out.println("xyz".equals(e.x)); //true expected
    }

    private void voidMethod(String s) {
        x = s;  
    }
}

答案 1 :(得分:0)

可能并非总是如此,但单元测试的基本概念是检查函数是否按预期工作,并在给出意外参数/情况时正确处理错误。 所以基本上单元测试是针对接受输入参数并返回一些输出的函数,所以我们可以编写那些单元测试。

然而,像你这样的代码包含一些其他的依赖项(数据库调用),除非你编写集成测试代码或真正的数据库连接相关的代码并且实际上不建议用于单元测试,否则你无法执行。

所以你需要做的可能是引入单元测试框架,尤其是Mockto / Powermock或其他提供对象模拟功能的东西。使用这些测试框架,您可以模拟数据库操作或将在测试单元代码之外发生的其他函数调用。

另外,关于如何测试void函数,没有什么可以使用Assert功能来比较输出,因为它没有像你提到的那样返回任何内容。 但是,仍有一种方法可以进行单元测试。

  1. 只需调用updateCustomerTagCount()以确保函数正常工作。即使只是调用该功能,这些单元测试也可以提高您的单元测试覆盖率。 当然,对于你的情况,你需要模拟
  2. ImportTagJob.fetchData();

    DatabaseInterface.getCustomer(TAGNO);

    并且必须。

    1. 让我们嘲笑
    2. ImportTagJob.fetchData();

      抛出空列表以及非空列表,并检查您的代码是否按预期工作。必要时添加异常处理。在你的代码中,有两个条件取决于fieList是null还是非null,你需要测试它。

      此外,模拟这些对象并让它们抛出IllegalArgumentException,您希望抛出它,并在函数抛出异常时编写单元测试。在Junit,它应该像

      @Test(expected = IllegalArgumentException.class)
      public void updateCustomerTagCountTest(){
          // mock the objects 
          xxxxx.updateCustomerTagCount();
      }
      

      这样,你可以确保函数在必要时正确抛出异常。