Mockito vérifier l’ordre / la séquence des appels de méthode

Est-il possible de vérifier si une methodOne est appelée avant methodTwo dans Mockito?

 public class ServiceClassA { public void methodOne(){} } public class ServiceClassB { public void methodTwo(){} } 

 public class TestClass { public void method(){ ServiceClassA serviceA = new ServiceClassA(); ServiceClassB serviceB = new ServiceClassB(); serviceA.methodOne(); serviceB.methodTwo(); } } 

InOrder vous aide à faire cela.

 ServiceClassA firstMock = mock(ServiceClassA.class); ServiceClassB secondMock = mock(ServiceClassB.class); Mockito.doNothing().when(firstMock).methodOne(); Mockito.doNothing().when(secondMock).methodTwo(); //create inOrder object passing any mocks that need to be verified in order InOrder inOrder = inOrder(firstMock, secondMock); //following will make sure that firstMock was called before secondMock inOrder.verify(firstMock).methodOne(); inOrder.verify(secondMock).methodTwo(); 

Notez que vous pouvez également utiliser la classe InOrder pour vérifier que différentes méthodes sont appelées dans l’ordre sur un seul simulacre, et pas seulement sur deux ou plusieurs simulacres.

Supposons que j’ai deux classes Foo et Bar :

 public class Foo { public void first() {} public void second() {} } public class Bar { public void firstThenSecond(Foo foo) { foo.first(); foo.second(); } } 

Je peux ensuite append une classe de test pour tester que la méthode firstThenSecond() Bar appelle en fait first() , then second() et non second() , puis first() . Voir le code de test suivant:

 public class BarTest { @Test public void testFirstThenSecond() { Bar bar = new Bar(); Foo mockFoo = Mockito.mock(Foo.class); bar.firstThenSecond(mockFoo); InOrder orderVerifier = Mockito.inOrder(mockFoo); // These lines will PASS orderVerifier.verify(mockFoo).first(); orderVerifier.verify(mockFoo).second(); // These lines will FAIL // orderVerifier.verify(mockFoo).second(); // orderVerifier.verify(mockFoo).first(); } } 

Oui, cela est décrit dans la documentation. Vous devez utiliser la classe InOrder .

Exemple (en supposant que deux simulacres ont déjà été créés):

 InOrder inOrder = inOrder(serviceAMock, serviceBMock); inOrder.verify(serviceAMock).methodOne(); inOrder.verify(serviceBMock).methodTwo();