是否有必要分别测试每种方法?

时间:2018-11-26 12:29:45

标签: java junit

我正在为我的控制器方法编写单元测试,许多方法调用其他方法,然后又调用其他方法,直到最终返回结果。现在,从我对最佳实践的阅读中可以看出,即使实际上已经通过另一种方法“测试”了一种方法,也应该对每种方法进行测试。

要对此进行透视,可以说我有这3种方法,并且我做了一个assertTrue(MethodA)是否真的有必要先测试MethodB,然后再测试MethodC?如果可以,为什么?

  public Boolean MethodA(Object o)
    {
        try {
            //Do stuff
            return MethodB(Object o);
        }
        catch(Exception e)
        {
            return false;
        }
    }

    public Boolean MethodB(Object o)
    {
        try {
            //Do stuff
            return MethodC(Object o);
        }
        catch(Exception e)
        {
            return false;
        }
    }

    public Boolean MethodC(Object o)
    {
        try {
            //Do stuff with o
            //return True
        }
        catch(Exception e)
        {
            return false;
        }
    }

3 个答案:

答案 0 :(得分:2)

这实际上取决于您和您的团队。在这种情况下,我可能会全部测试。

一个原因是:我还能如何确保methodA()返回false时是由于在methodB()中进行的计算还是那里的异常?同样的问题也适用于methodC() ...如果引发异常,我们会得到false,但是我如何知道(实际上:确保)异常是由于异常还是实际的呢?计算?

如果您要通过methodA()进行测试,则仅该测试可能会变得过于复杂,并且您会为该特定测试添加过多的内部工作逻辑。尝试从外部角度测试/挑战您的方法。您可能想单独测试从外部可见的所有内容。另外:使您的测试足够简单,以便您返回时可以轻松掌握为何用这种方法进行测试。

答案 1 :(得分:2)

是的,您应该对它们全部进行测试。在将来的某个时候,一种调用方法(例如MethodA)的实现可能会更改,您需要测试所有旧用法是否仍然适用。在这种情况下,我将考虑以下几点:

  • 是否真的需要使所有这些方法仅调用另一个正在调用另一个方法的方法,等等?我的意思是,如果所有方法都是公共的,为什么外部对象应该调用MethodA而不直接调用MethodC?我并不是说您必须消除所有内部调用,但是公共方法应该公开唯一的功能,并且每个功能只能通过一个方法使用。
  • 您可以将某些方法设为私有吗?如果您有这种嵌套的重用代码调用,则应避免外部对象来封装被调用的方法,因为它们实际上是实现细节,而不是公开功能的一部分。

答案 2 :(得分:2)

查看此问题How to best test Java code?。 关于如何测试以及需要测试多少代码,有一些好的建议 (答案https://stackoverflow.com/a/1139266/10606957说明了编程中的80:20方法)。 即使这些答案针对的是更大的项目,也最好从头开始学习。

注意:本来可以发表评论,但我尚未解锁评论喷气机^^