2017-01-20 1 views
5

mockito를 사용하여 비즈니스 서비스를 테스트하고 있으며, 모의하려고하는 유틸리티를 사용합니다. 서로 다른 인수를 갖는 유틸리티에 대해 각 서비스 메소드에 적어도 2-3 개의 호출이 있습니다.다른 매개 변수를 사용하여 모의 메소드를 동일하게 처리하십시오.

when(...).thenReturn(...)을 동일한 방법이지만 다른 인수로 사용하는 권장 방법이 있습니까?

또한 any() marcher도 사용하고 싶습니다. 가능한가?

업데이트 : 샘플 코드.

@Test 
public void myTest() { 
    when(service.foo(any(), new ARequest(1, "A"))).thenReturn(new AResponse(1, "passed")); 
    when(service.foo(any(), new ARequest(2, "2A"))).thenReturn(new AResponse(2, "passed")); 
    when(service.foo(any(), new BRequest(1, "B"))).thenReturn(new BResponse(112, "passed")); 

    c.execute(); 
} 

public class ClassUnderTest { 
    Service service = new Service(); 
    public void execute() { 
    AResponse ar = (AResponse) service.foo("A1", new ARequest(1, "A")); 
    AResponse ar2 = (AResponse) service.foo("A2", new ARequest(2, "2A")); 
    BResponse br = (BResponse) service.foo("B1", new BRequest(1, "B")); 
    } 
} 

public class Service { 
    public Object foo(String firstArgument, Object obj) { 
    return null; //return something 
    } 
} 
+0

이것은 상반됩니다. 'any()'를 지정하면, 어떤 것을 의미하지만, 동시에?!? 적절한 matchers를 사용하십시오. – SpaceTrucker

+0

제발 어떤 식 으로든 추천 해주세요. 나는 하나의 매개 변수에 대한 객체를 만들 수 없다. 그래서 나는 any()를 사용하지만, 반항 적으로는 작동하지 않을 것이다. 나는 내가 똑같은 일을하고 싶다고 말하려고했다. –

답변

8

단 하나의 방법은 하나의 thenReturn 호출로 모든 예상 된 결과를 제공하기 위해 인수에 너무 제한적일 것을 피할 수 있습니다. foo

// Mock the call of foo of any String to provide 3 results 
when(mock.foo(anyString(), anyObject())).thenReturn("val1", "val2", "val3"); 

전화로 : 아래처럼 원하는

public String foo(String firstArgument, Object obj) { 
    return "Something"; 
} 

당신은 다음과 같은 많은 결과를 제공하여 조롱 수 :

예를 들어의 나는이 방법을 조롱하려는 가정 해 봅시다 모든 매개 변수는 각각 "val1", "val2"을 제공하며 이후의 모든 호출은 "val3"을 제공합니다. 경우


당신은 전달 된 값에 대한 관리 작업을 수행하지만 현재처럼하지만 3 가지 thenReturn와 두 번째 인수와 일치하는 답을 제공하기 위해 thenAnswer을 사용할 수있는 호출 순서에 의존하고 싶지 않아요.

when(mock.foo(anyString(), anyObject())).thenAnswer(
    invocation -> { 
     Object argument = invocation.getArguments()[1]; 
     if (argument.equals(new ARequest(1, "A"))) { 
      return new AResponse(1, "passed"); 
     } else if (argument.equals(new ARequest(2, "2A"))) { 
      return new AResponse(2, "passed"); 
     } else if (argument.equals(new BRequest(1, "B"))) { 
      return new BResponse(112, "passed"); 
     } 
     throw new InvalidUseOfMatchersException(
      String.format("Argument %s does not match", argument) 
     ); 
    } 
); 
+0

@ ZeeshanBilal 왜? 인수가 동일하지 않으면 실패를 원합니까? –

+0

내 서비스 구현에 있기 때문에 매개 변수의 조합이 서로 다를 수 있습니다.그러나 나는 특정한 논점으로 만 진행하고 싶다. 내부 단계가 제대로 실행되는지 확인하는 방법이라고 생각합니다. –

+0

만약 그렇다면 현재 수행하고있는 것보다 더 잘 할 수 있다고 생각하지 않습니다 –

0

제가 생각하기에 : "권장되는"방법이 당신을 위해 일하는 것입니다; 최소한의 코딩 노력이 필요합니다.

테스트를 수행하는 데 필요한 THOSE 사양을 제공해야합니다. 그 주위에 방법이 없습니다.

사용 된 인수에 대해 정말로 신경 쓰는 경우 적절하게 지정해야합니다. 상관하지 않는다면; any()을 사용하십시오.

+0

나는 또한 내부에서'any()'marcher도 사용하고 싶습니다. 가능한가? –

+0

죄송합니다. "내부"란 무엇입니까? –

0

올바른 방법은 eq()을 사용하여 인수를 일치시키는 것이지만, 그렇게하고 싶지 않으면 여러 개의 반환 값을 기록 할 수 있습니다.

when(someService.doSomething(any(SomeParam.class))).thenReturn(
    firstReturnValue, secondReturnValue, thirdReturnValue 
); 

이제 첫 번째 통화는 thirdValue을 다음 firstValue, 두 번째 secondValue 모두를 반환합니다.

관련 문제