Mockito在一组其他人之前/之后验证呼叫



如何验证一个调用发生在多个其他调用之后(或之前),而不指定其他调用的顺序?

例如:

objA.method1();
objB.method2();
objC.method3();
transaction.commmit();

我可能想检查一下在所有其他交互之后是否调用了commit。但我不想把它们限制在一个特定的序列上。

可能有更好的选择(我会等待其他答案),但一种选择是定义三个不同的InOrder,每个方法调用(objA、objB、objC)和事务一个,然后独立验证所有InOrder。

类似的东西(只是一个例子):

class ObjA {
  void method1() {}
}
class ObjB {
  void method2() {}
}
class ObjC {
  void method3() {}
}
class Transacction {
  void commit() {};
}
class ClassToTest {
  private ObjA objA;
  private ObjB objB;
  private ObjC objC;
  Transacction transaction;
  ClassToTest(ObjA objA, ObjB objB, ObjC objC, Transacction transaction) {
     this.objA = objA;
     this.objB = objB;
     this.objC = objC;
     this.transaction = transaction;
  }
  void method() {
     objA.method1();
     objC.method3();
     objB.method2();
     transaction.commit();
  }
}

测试方法:

@Test
public void testMethod() throws Exception {
   ObjA objA = mock(ObjA.class);
   ObjB objB = mock(ObjB.class);
   ObjC objC = mock(ObjC.class);
   Transacction transaction = mock(Transacction.class);
   // Create a InOrder per each call and transaction
   InOrder inOrderObjA = inOrder(objA, transaction);
   InOrder inOrderObjB = inOrder(objB, transaction);
   InOrder inOrderObjC = inOrder(objC, transaction);
   ClassToTest classToTest = new ClassToTest(objA, objB, objC, transaction);
   classToTest.method();
   // Verify transaction.commit() is executed after objA.method1()
   inOrderObjA.verify(objA).method1();
   inOrderObjA.verify(transaction).commit();
   // Verify transaction.commit() is executed after objB.method2()
   inOrderObjB.verify(objB).method2();
   inOrderObjB.verify(transaction).commit();
   // Verify transaction.commit() is executed after objC.method3()
   inOrderObjC.verify(objC).method3();
   inOrderObjC.verify(transaction).commit();
}    

希望它能帮助

可能不是你想要的答案,但有时很难测试代码意味着是时候重构了。提取三个顺序独立的方法调用序列作为单个方法myClass.abcMethods(),然后在SUT上使用Spy只需对myClass.abcMethods()transaction.commit() 进行InOrder验证

最新更新