【问题标题】:Test method that returns void返回 void 的测试方法
【发布时间】:2014-02-22 11:00:47
【问题描述】:

我有一个 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();
    }

}

【问题讨论】:

  • 在方法前后检查客户。
  • 你想测试什么?
  • 每次有新标签时我都必须更新客户否

标签: java testing jdbc


【解决方案1】:

当方法返回 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;  
    }
}

【讨论】:

    【解决方案2】:

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

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

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

    另外,关于我如何测试 void 函数,您无法使用 Assert 功能来比较输出,因为正如您所提到的,它不会返回任何内容。 不过,还是有办法进行单元测试的。

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

    ImportTagJob.fetchData();

    DatabaseInterface.getCustomer(tagNo);

    而且必须。

    1. 让嘲笑

    ImportTagJob.fetchData();

    抛出空列表和非空列表并检查您的代码是否按预期工作。如有必要,添加异常处理。在您的代码中,有两个条件取决于 fieList 是 null 还是 non-null,您需要对其进行测试。

    此外,模拟这些对象并让它们在您期望它被抛出的地方抛出 IllegalArgumentException,并在函数抛出异常时编写单元测试。在 Junit 中,应该是这样的

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2014-05-10
      • 2015-10-03
      • 1970-01-01
      相关资源
      最近更新 更多