Unit testing Mockito在其他组之前/之后验证调用
如何验证一个调用发生在多个其他调用之后(或之前),而不指定其他调用的顺序 例如:Unit testing Mockito在其他组之前/之后验证调用,unit-testing,mockito,verify,Unit Testing,Mockito,Verify,如何验证一个调用发生在多个其他调用之后(或之前),而不指定其他调用的顺序 例如: objA.method1(); objB.method2(); objC.method3(); transaction.commmit(); 我可能想检查在所有其他交互之后是否调用了commit。但我不想将它们限制在特定的序列上。可能有更好的选择(我将等待其他答案),但一个选择是定义三个不同的选项,每个方法调用(objA、objB、objC)和事务一个,然后独立地按顺序验证所有选项 类似这样的内容(只是一个示例)
objA.method1();
objB.method2();
objC.method3();
transaction.commmit();
我可能想检查在所有其他交互之后是否调用了
commit
。但我不想将它们限制在特定的序列上。可能有更好的选择(我将等待其他答案),但一个选择是定义三个不同的选项,每个方法调用(objA、objB、objC)和事务一个,然后独立地按顺序验证所有选项
类似这样的内容(只是一个示例):
试验方法:
@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上使用间谍只需按顺序执行验证myClass.abcMethods()
,然后执行transaction.commit()
Hi@Vituel,您尝试过提供的答案吗?希望有帮助
@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();
}