2014-04-16 2 views
3

특정 문자열 세트를 매개 변수로 사용하여 mocked가 호출되도록하고 싶습니다. 예를 들어, 나는 다음과 같은 코드가 있습니다특정 값을 포함하는 set을 사용하여 Mockito 확인 메소드가 호출되었습니다.

public class SomeLogic { 
    @Autowired 
    private SpecificService specificService; 

    public void action() { 
     Set<String> args = fillArgsMethod(); 
     specificService.handleArgs(args); 
    } 
} 

그리고 그것이

@Mock 
private SpecificService specificService 
@InjectMocks 
private SomeLogic someLogic; 

@Test 
public void testAction() { 
    someLogic.action(); 
    verify(specificService).handleArgs(anySet()); 
} 

따르는 테스트하기 위해 내 현재 시도하지만 handleArgs()가 정확한 세트를받을 것,해야 할 내가 기대하는 현의 handleArgs가 "first", "second"집합으로 호출되는지 확인하기 위해 확인을 수정하려면 어떻게해야합니까? 감사

답변

7

@Test 
    public void testAction() { 
     Set<String> expectedParams = new HashSet(Arrays.asList("first", "second"); 
     //call tested method 
     verify(specificService).handleArgs(expectedParams); 
    } 
+0

덕분에, 나는 Hamcrest 방법이 필요하다고 생각하지만,이 솔루션은 훨씬 더 간단 – me1111

+0

천만에요 것으로 나타났다. Hamcrest는 테스트가 실패 할 때 더 좋은 matchers와 더 나은보고 기능을 가지고 있기 때문에 사용합니다. – isah

10

Isah가 올바른 답을 준 테스트 메서드를 호출하기 전에 Set 매개 변수를 준비,하지만 난 ArgumentCaptor

에 Mockito의 일반적인 기능에 관심을 설정하려면 당신은 다음과 같은 라인을 따라 뭔가를 할 것입니다 :

Class<HashSet<String>> setClass = (Class<HashSet<String>>)(Class)HashSet.class; 
ArgumentCaptor<Set<String>> setCaptor= ArgumentCaptor.forClass(setClass .class); 

verify(specificService).create(setCaptor.capture()); 
HashSet<String> capturedSet = setCaptor.getValue(); 

//do whatever test you want with capturedSet 
+1

이 경우에는 과잉 공격 일 가능성이 있지만 더 일반적인 해결책이 무엇인지에 대한 일반적인 아이디어를 얻을 수 있습니다. :) – geoand

6

isah의 솔루션은 완벽합니다. 세트에 정확히 두 항목이 포함되어 있는지 확인하려면 해당 항목을 선택하십시오. Mockito는 기본적으로 .equals을 사용하여 비교하며 Set.equals은 임의의 순서로 동일한 요소를 참조하는 것으로 정의됩니다. 보다 유연한 들어

이 당신의 기대 값을 넘어 세트 구성원을 허용 귀하의 질문에 제목을 일치 테스트를 "포함", 당신은 또한 the Hamcrest contains matcher 사용할 수 있습니다

someLogic.action(); 
verify(specificService).handleArgs(argThat(contains("first", "second"))); 

적어도, 그건 어떻게 해야 봐. 불행히도 argThat은 반환 형식을 인수에서 유추하는 Matcher에서 유추합니다. 따라서 Java는 첫 번째 인수가 Set<String>이 아니라 Iterable<capture#1-of ? extends String>이 아니라고 가정합니다. 당신은 일하러 가야 경고를 명시 적으로 캐스팅 억제해야합니다 :

// requires @SuppressWarnings("unchecked") 
verify(specificService).handleArgs(
    (Set<String>) argThat(contains("first", "second"))); 
관련 문제