Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Mockito在其他组之前/之后验证调用_Unit Testing_Mockito_Verify - Fatal编程技术网

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();
}