2013-07-20 2 views
0

나는 다음과 같은 서비스 클래스가있다 반환하지 않는 방법을 호출하는 경우 확인 . 나는 그 방법을 조롱해야 할까? 메소드를 조롱해야한다면, 아무 것도 리턴하지 않는 메소드를 어떻게 조롱 하는가? when에는 메소드에서 무언가를 반환해야합니다.mockito는 조건이 통과 anythig

+0

은'Person' 클래스의 전체 코드를 보여주십시오; 또한, 왜 불변 클래스 대신 빈을 사용 하는가? (지금은'Person'이 컴파일 할 수 없다.) – fge

+0

또한'dao.getAge (anyInt())'를 호출했지만 코드에는'dao.getAge (일부)'. 더 많은 코드를 표시하십시오. – fge

+0

실제 코드가 너무 크고 너무 많습니다. 방금 샘플로 논리를 에뮬레이션했습니다. AgeDAO 및 Speaker는 EJB를 주입합니다. –

답변

2

으로 말하는 방법을 조롱 수 있습니다 (특히 : checkSepakList<Jon> 필요하지만 코드는 List<Integer>입니다 ages을 통과).

이들을 수정 한 후 테스트에서 생성 된 (그리고 dao.getAges()의 반환 값으로 사용 된) ages 목록이 비어 있기 때문에 테스트에 실패했다는 것을 깨달았습니다. 따라서 ages != null && !ages.isEmpty() 조건이 충족되지 않아 코드가 speaker.speak() 호출을 건너 뜁니다.

확실한 솔루션은 몇 가지 요소를 추가하여 ages 목록이 비어 있도록하는 것입니다 :

public class MyTest { 
    @Test 
    public void speakTest() { 
    Person p = new Person(); 
    Speaker speaker = mock(Speaker.class); 
    p.speaker = speaker; 

    AgeDAO dao = mock(AgeDAO.class); 
    p.dao = dao; 

    List<Jon> list = createJonList(); 
    List<Integer> ages = createAgesList(); 
    ages.add(5); // Make the list of ages non-empty 
    when(dao.getAge(anyList())).thenReturn(ages); 
    p.checkSpeak(list); 

    verify(p.speaker).speak(anyList()); 

    } 

    private List<Integer> createAgesList() { 
    return new ArrayList<Integer>(); 
    } 

    private List<Jon> createJonList() { 
    return new ArrayList<Jon>(); 
    } 
} 

class Person { 
    AgeDAO dao; 
    Speaker speaker; 

    public void checkSpeak(List<Jon> list) { 
    List<Integer> ages = dao.getAge(list); 

    if (ages != null && !ages.isEmpty()) { 
     speaker.speak(list); 
    } 
    } 
} 
0

나는 dao에 대해서만 "when"을 사용 했으므로 Speaker 용 객체를 모의 할 필요가 없다고 생각합니다. 발언자가 조롱 할 필요가있는 객체가 없으면 발화 방법을 실패하게 만들지 않으므로 발언자를 조롱 할 필요가 없습니다. p.speaker = new Speaker();를 실행 해보십시오. 이것은 Speaker 클래스 코드가 어떤 것인지 잘 모르기 때문에 가장 좋은 추측입니다.

0

당신은 당신이 게시 코드에서 몇 가지 사소한 문제가 있었다 doNothing