web-dev-qa-db-ja.com

Mockitoはメソッド呼び出しの順序/シーケンスを確認します

MockitoでmethodOneの前にmethodTwoが呼び出されるかどうかを確認する方法はありますか?

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

InOrder は、そのために役立ちます。

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

InOrder クラスを使用して、2つ以上のモックだけでなく、単一のモックでさまざまなメソッドが順番に呼び出されることを確認することもできます。

FooBarの2つのクラスがあるとします:

public class Foo {
  public void first() {}
  public void second() {}
}

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

次に、テストクラスを追加して、BarfirstThenSecond()メソッドが実際にfirst()を呼び出し、次にsecond()を呼び出し、second()first()ではないことをテストできます。次のテストコードを参照してください。

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

はい、これはドキュメントに記載されています。 InOrder クラスを使用する必要があります。

例(2つのモックがすでに作成されていると仮定):

InOrder inOrder = inOrder(serviceAMock, serviceBMock);

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