Java坏习惯:只为测试而向方法添加return语句?

Java坏习惯:只为测试而向方法添加return语句?,java,unit-testing,testing,Java,Unit Testing,Testing,仅仅为了测试一个方法而添加一个return语句,而不在实际代码中使用它,这是一种不好的做法吗 作为一个例子,我正在测试一个read方法,然后是一系列方法,这些方法最终创建一个对象,对象的属性从它正在读取的文件的行中吸收 据我所知,可以使用Mockito测试read方法,而无需添加return语句。或者可以测试是否调用了另一个readPerLine方法,但我还没有找到一个合适的测试过程来实现这一点。这两个选项可能意味着如果使用了正确的编码程序,我的一般问题就不相关了,如果是,请让我知道 但是,目前

仅仅为了测试一个方法而添加一个return语句,而不在实际代码中使用它,这是一种不好的做法吗

作为一个例子,我正在测试一个read方法,然后是一系列方法,这些方法最终创建一个对象,对象的属性从它正在读取的文件的行中吸收

据我所知,可以使用Mockito测试read方法,而无需添加return语句。或者可以测试是否调用了另一个readPerLine方法,但我还没有找到一个合适的测试过程来实现这一点。这两个选项可能意味着如果使用了正确的编码程序,我的一般问题就不相关了,如果是,请让我知道

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

添加一个返回语句,该语句包含方法读入的行数组,该数组在方法末尾执行。 通过测量对象的属性是否正确,测试创建对象的读取方法和后续方法的组合。并通过单独测试后续方法。这不是首选的双重错误,1个在读取方法中,1个在后续方法的概念设计中,可能会在测试期间取消,但会在读取寿命中导致错误。 修改read方法,使其返回一个行数组,该数组从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();
        }
    }
因此,我还没有解决以下困境

我知道有时候你需要重写你的方法来进行测试。 但我不知道是否添加了返回语句等功能 不是由实际代码使用,而是仅用于测试的,是好的还是坏的 坏习惯。另外,如果我这样做,我仍然没有完全测试read方法,调用另一个方法仍然没有测试。 或者,如果我一开始就使用适当的礼仪,这种困境是否就不应该发生。
我建议不要向方法中添加return语句来启用测试,而应该重新编写方法来分离一些功能

我认为问题在于:

readPerLine(line); //converts line into properties for an object.
也许你用这种方法做得太多了。您可以将其分解为几种不同的方法,例如:

读取该行以获取字符串数组 将字符串转换为正确的数据类型 构建对象并设置其属性 如果您这样做了,您可以检查每个步骤的功能,并对每个步骤进行测试。
在测试主方法readFileString filename时,可以使用Mokito检查每个方法是否使用正确的参数调用

为什么不测试readPerLine的效果?这是什么变化/设置的?您可能想在上问这个问题谢谢您的建议,因为我假设根据另一个方法readPerLine的有效性测试一个方法readFile是不好的做法/不需要的。因为第2点解释的原因。如果你的第二个问题的意思是,readPerLine做什么/变异/设置什么?我没有确切地定义它,或者它调用了两个方法,迭代对象的所有字段和方法,或者调用了另一个方法,使用这些字段来分析输入线。然后,数据被传递给一个创建对象的方法。@SteveSmith谢谢,我没有想到要查看那里。我会检查它是否更适合那里,如果是的话,我会移动它。