Mockito는 메소드 호출 순서 / 순서 확인


205

Mockito에서 methodOne이전 methodTwo에 a 가 호출 되었는지 확인하는 방법이 있습니까?

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

답변:


305

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

5
다른 스텁에 대한 자리 표시자를 제외하고 여기서 doNothing에 대한 호출이 필요하지는 않지만이 방법은 정확합니다. Mockito는 기본적으로 void 메소드 호출을 자동으로 수락합니다.
Jeff Bowman

1
객체에 의존성이 있으면 객체에 의존성이없는 동안 그것들을 받아들입니다. 예외가있을 것입니다 =)
Koitoer

14
고려 inOrder.verifyNoMoreInteractions();의 마지막은 다른 통화가 이루어지지되었는지 확인하기 위해이 예에서 확인 후.
DwB 2016 년

1
명확히하기 위해 : 모의에 대해 (테스트 된) 메소드를 호출 한 후 확인 직전에 inOrder를 정의하는 것이 안전합니다.
user3078523

결과에 대해 동일 inOrder(firstMock, secondMock)하고 inOrder(secondMock, firstMock)? 아마도 이에 대한 메모를 작성하기 위해 답변을 업데이트 할 수 있습니다.
kevinarpe

95

또한 InOrder 클래스를 사용하여 둘 이상의 모의 객체가 아닌 단일 모의 객체에서 다양한 메소드가 순서대로 호출되는지 확인할 수 있습니다 .

나는 두 개의 클래스가 있다고 가정 FooBar:

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

1
이것은 완전히 새로운 답변이 아니라 수락 된 답변에 대한 의견이어야합니다.
ach

12
귀하의 의견에 동의하지 않습니다 @ach 코드 샘플이 도움이되므로 새로운 답변이 적합합니다.
Snekse

2
동일한 메소드가 두 번 호출되는지 확인하는 방법이 있지만 전달 된 매개 변수의 순서를 확인합니까? 예를 들어, First find('foo')다음find('bar')
Snekse

1
이것이 내 답변이 될 것 같습니다 stackoverflow.com/questions/36573399/…
Snekse

3
그것보다 더 일반적인 사용 보여주기 때문에 이것은 실제로 허용 대답보다 더 좋은 예이다doNothing()
아르키메데스 Trajano

37

예, 설명서에 설명되어 있습니다. InOrder 클래스 를 사용해야합니다 .

예 (두 개의 목이 이미 생성되었다고 가정) :

InOrder inOrder = inOrder(serviceAMock, serviceBMock);

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

1

BDD로

@Test
public void testOrderWithBDD() {


    // Given
    ServiceClassA firstMock = mock(ServiceClassA.class);
    ServiceClassB secondMock = mock(ServiceClassB.class);

    //create inOrder object passing any mocks that need to be verified in order
    InOrder inOrder = inOrder(firstMock, secondMock);

    willDoNothing().given(firstMock).methodOne();
    willDoNothing().given(secondMock).methodTwo();

    // When
    firstMock.methodOne();
    secondMock.methodTwo();

    // Then
    then(firstMock).should(inOrder).methodOne();
    then(secondMock).should(inOrder).methodTwo();


}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.