如何验证它是最后一个调用的方法

时间:2018-12-04 14:17:18

标签: junit mockito powermockito

是否有任何方法可以验证b.method1()是否是最后一个调用的方法? 另一个问题是,在测试开发阶段,我无法确切知道在此方法之前调用了哪些方法。我正在使用Mockito,PowerMockito和Junit。 inOrder不能在这里使用!第一个原因-我有私人方法。这里所有公众都是一个很好的例子。第二个原因-我什至不知道方法的数量,可以在b.method1()之前调用。

测试类:

public class Test{

    public static void main(String[] args) {
            A a = new A();
            B b = new B();
            a.method2();
            a.method3();
            b.method2();
            b.method1();
        }
}



public class A{

    public void method1(){}

    public void method2(){}

    public void method3(){}
}



public class B{

    public void method1(){}

    public void method2(){}

    public void method3(){}
}

1 个答案:

答案 0 :(得分:0)

您提到了阻止您使用 inOrder 的 2 个问题

  • 你不知道之前调用过哪些方法
  • 你有私有方法

这两个都不是正当理由。始终可以使用 inOrder。

无论你的方法需要做什么,都应该只取决于两件事:

  • 传递给方法的参数。
  • 状态。并且在一个设计良好的类中,该类应该仅限于您正在调用的方法的对象的状态。

参数中任何可能的数据组合和对象的状态都可以使用模型进行模拟。并且您的方法中发生的任何事情(正在执行的方法调用)都应该由您了解,否则您将不知道您要测试什么。

因此,如果之前调用了任何方法,无论是否为私有,都有两种可能性:

  • 它对您的方法有影响。在这种情况下,它应该在对象的状态中可见,您可以在多个测试用例中以不同的方式初始化测试对象和模型,以测试不同的可能性。
  • 它对您的方法没有影响。在这种情况下,这显然不会成为您的测试问题。

唯一可能会遇到麻烦的情况是直接调用其他类的静态方法或直接读取静态字段并且它们的状态会产生影响。在这些情况下,最好将此类调用隔离在一个不包含太多逻辑并充当包装器的类中的单独方法中。这样你就有了一个可以模拟的包装器,从而解决了问题。

一种特殊情况是被调用的构造函数。构造函数是一种特殊的静态方法。上面提到的静态方法对应于创建一个工厂类来构造对象。但是构造函数创建了一些还没有状态的东西。这意味着它的状态对于您的测试来说不能是不可预测的/有问题的。但即便如此,可以模拟的工厂对于避免测试中不必要的复杂性和依赖性也非常有用。

结论:

当您知道您的方法在做什么并且它不直接使用来自其他类的静态数据时,您可以随时使用 inOrder 检查所有内容并在最后添加对 verifyNoMoreInteractions 的调用以确保您验证的最后一个方法是最后一个一个被称为。

即使它确实直接使用了其他类的静态数据,这会使您的测试复杂化,这也是一个可以轻松解决的设计问题。