Java不良做法:仅将return语句添加到方法中以进行测试?

时间:2019-02-04 16:24:38

标签: java unit-testing testing

添加return语句仅用于测试方法而不在实际代码本身中使用它是否是错误的做法?

作为一个示例,我正在测试一个read方法,然后是一系列方法,这些方法最终将创建一个对象,该对象的属性被其正在读取的文件行所吸收。

据我了解,可以使用Mockito测试读取方法,而不必添加return语句。或者可以测试是否调用了另一种方法(readPerLine),但是我还没有找到合适的测试程序来执行此操作。这两个选项可能意味着如果使用正确的编码过程,我的一般性问题就不重要了,如果可以,请告诉我。

但是,目前,以下两个选项似乎是测试read方法(一部分)的最简单方法:

  1. 添加一个return语句,其中包含该方法读取的行的数组,该语句在该方法的末尾执行。
  2. 通过测量对象的属性是否正确来测试读取方法和创建对象的后续方法的组合。并通过单独测试后续方法。这不是双重错误,读取方法中为1,后续方法的概念设计中为1,可能会在此测试中被抵消,但会导致读取寿命错误。
  3. 修改(读取)方法,使其返回行的数组,该数组从Main传递到后续方法。

我当前编写的read方法的示例代码:

public void readFile(String filename) {
        FileReader reader;
        BufferedReader br;
        String line = null;
        try {       
            br = new BufferedReader(new FileReader(filename));

            while ((line = br.readLine()) != null) {
                readPerLine(line); //converts line into properties for an object.
            }  
            br.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

所以我还没有解决以下难题;

  • 我知道有时候您需要重写您的方法以进行测试。
  • 但是我不知道是否添加功能,例如return语句 实际代码未使用的代码,仅用于测试,良好或 坏习惯。此外,如果这样做,我仍然不会完全测试read方法,调用另一个方法仍不会测试。
  • 或者如果我一开始就应用适当的礼节,这个困境是否应该根本不发生。

1 个答案:

答案 0 :(得分:1)

我建议不要在该方法中添加return语句以启用测试,而应该对方法进行重新设计以分离某些功能。

我认为问题出在这里:

readPerLine(line); //converts line into properties for an object.

也许您在此方法中做得太多。您可以将其分解为几种不同的方法,例如:

  1. 读取该行以获得String数组
  2. 将字符串转换为正确的数据类型
  3. 构建对象并设置其属性

如果执行此操作,则可以检查每个步骤的功能并为每个步骤进行测试。 在测试主要方法readFile(String filename)时,您可以使用Mokito来检查是否使用正确的参数调用了每个方法