web-dev-qa-db-fra.com

Mockito vérifier l'ordre / séquence d'appels de méthode

Existe-t-il un moyen de vérifier si un methodOne est appelé 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();
    }
}
169
froi

InOrder vous aide à le faire.

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();
248
Koitoer

Notez que vous pouvez également utiliser la classe InOrder pour vérifier que différentes méthodes sont appelées dans l’ordre sur une seule et même simulation, et non pas seulement sur deux ou plus.

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 ajouter une classe de test pour tester que la méthode firstThenSecond() de Bar appelle réellement first(), puis 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();
  }
}
77
entpnerd

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

Exemple (en supposant que deux modèles soient déjà créés):

InOrder inOrder = inOrder(serviceAMock, serviceBMock);

inOrder.verify(serviceAMock).methodOne();
inOrder.verify(serviceBMock).methodTwo();
34
LaurentG