如何验证一个调用发生在多个其他调用之后(或之前),而不指定其他调用的顺序?
例如:
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
验证