2014-05-16 4 views
1

나는 최근에 Mockito (또는 조롱/스터 빙)를 사용하기 시작했습니다. 나는 물체를 조롱하는 방법에 처진지기 시작 해요,하지만 난 다음 코드에 붙어 :mockito : WrongTypeOfReturnValue (JAVA)

// line causing the problem 
when(station1.retrievePendingTasks().size()).thenReturn(0); 

// error msg 
org.mockito.exceptions.misusing.WrongTypeOfReturnValue: 
Integer cannot be returned by retrievePendingTasks() 
retrievePendingTasks() should return Set 

그것은 분명히 할 수있는 내게 말하고 :

public class ConveyorBeltTest { 
private Layout layout; 
@Mock private WorkStation station1; 
@Mock private WorkStation station2; 
@Mock private WorkStation station3; 
@Mock private CarAssemblyProcess car1; 
@Mock private CarAssemblyProcess car2; 

@Before 
public void setUp() { 
    layout = new Layout(); 
    layout.getWorkStations().add(station1); 
    layout.getWorkStations().add(station2); 
    layout.getWorkStations().add(station3); 
    when(station1.retrievePendingTasks().size()).thenReturn(0); 
    when(station2.retrievePendingTasks().size()).thenReturn(2); 
    when(station3.retrievePendingTasks().size()).thenReturn(1); 
    when(station1.getCar()).thenReturn(car1); 
    // it's impossible to have a car in a workstation and to have pending tasks, but it's tested regardless 
    when(station2.getCar()).thenReturn(car2); 
    when(station3.getCar()).thenReturn(null); 
} 

다음 줄을 던졌습니다 station1이 실제 객체가 아니라 모의 객체이기 때문에 station1.retrievePendingTasks()를 인식하지 못합니다. 그러나 나는 모의가 있다면 모의 명령 뒤에 명령을 내릴 수 있다고 생각했다. 그 명령은 예상되는 최종 결과를 thenReturn()에 제공하는 한 모두 중요하지 않다. 누군가 내가 정확히 여기서 잘못한 것을 분명히 할 수 있습니까?

또한 함께 시도 :

doReturn(0).when(station1).retrievePendingTasks().size(); 

하지만 결과는 동일합니다.

해결 방법은 새로운 Set을 만들고 모의 요소로 채우고 각 스테이션의 retrievePendingTasks() 결과에 전달하는 것입니다. 내 유일한 목표는 세트의 크기에 대한 숫자를 가질 때 화면을 막히게하는 추가 코드입니다.

답변

1

retrievePendingTasks가 리턴하는 것을 조롱하고 그 메소드가 리턴 한 것이 무엇인지 직접 조롱합니다. 코드를

when(station1.retrievePendingTasks()).thenReturn(new HashSet()); 

또는 그와 비슷한 것으로 변경하면 반환되는 세트의 크기가 자체적으로 처리됩니다.

크기가 필요한 경우 Set의 모의 구현을 할 수 있습니다. 또는 skegg99's answer에서 깊은 스텁 접근 방식을 사용할 수 있습니다. 흥미롭게도 경고 메시지가 있습니다. API documentation :

경고 :이 기능은 일반 코드에서는 거의 필요하지 않습니다. 레거시 코드 용으로 남겨 두십시오. 모형 모의, 모의 반환 (...), Demeter의 법칙 위반 또는 값 객체 조롱 (잘 알려진 반 패턴)에 대한 의미있는 힌트를 반환합니다.

일반적으로 공통된 빌드 블록 인 Java 콜렉션과 같은 것들을 조롱하는 것은 불필요하며 테스트가 허술해집니다. 예를 들어 크기를 결정하기 위해 코드를 변경하면 다른 방법으로 테스트가 중단됩니다. 테스트중인 코드가 반복자를 사용하도록 변경되고 직접 크기를 테스트하지 않으면 테스트가 중단됩니다. 또는 빈 세트가있는 다른 결과가있는 경우 별도로 모의해야하고 더 많은 작업을 수행해야하며 구현이 변경되면 다시 위험을 초래할 수 있습니다. 나는 불필요하게 모의하지 않으려 고 노력한다.

+0

을 피하기 위해 테스트를 다시 작성하는 것이 좋습니다 실제로 모의 객체를 사용하지 않고 그것을 다시 할 수있는 방법을 찾을 수 있었다 (대부분) : P 당신은 아마 그 말이 맞아 내가 할 수있을 때마다 나는 조롱을 피해야합니다. 나는 단지 하루나 이틀 전에 이것을 배웠고 약간의 흥분을 감추었습니다! 미래 상황을 아는 것은 여전히 ​​유용합니다. 감사!:) – Babyburger

+0

@Babyburger : 도망가는 것은 우리 모두에게 일어납니다. 나는 이미 그렇게 계속 조롱하고있는 많은 코드베이스를 가지고있다. –

4

필자는 깊은 스터브라고하며 특별한주의가 필요하다고 생각합니다. 당신은 this 방법을 사용하고

@Mock(answer=Answers.RETURNS_DEEP_STUBS) 

를 추가하지만 그것을

+0

+1 깊은 스텁 링크에 대해, 나는 그것을 인식하지 못했습니다. –