2014-10-01 2 views
1

"now"Date 객체에 의존하는 메서드가 있습니다.mockito 스파이를 사용하여 메서드 호출을 리디렉션하는 방법?

단위 테스트를 작성하고 싶습니다.

그래서 가짜 고정 "지금"날짜를 삽입하여 테스트를 결정합니다.

private ImagesSorter setServerWithSpyImageSorter(User user, List imagesAsInsertionOrder, Date fakeNowDate) throws IOException { 
     ImagesSorter imagesSorter = spy(new ImagesSorter()); 
     when(imagesSorter.sortImages(imagesAsInsertionOrder, user)).thenReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)); 
     //doReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)).when(imagesSorter).sortImages(imagesAsInsertionOrder, user); 
     server = VenueServerImplBuilder.create().withImagesSorter(imagesSorter).build(); 
     server.init(); 
     return imagesSorter; 
    } 

을했지만 작동하지 않습니다

나는이 같은 스파이를 주입하기 위해 노력했다.

1) doReturn(imagesSorter.sortIm..을 사용했을 때 열심히 평가했습니다. 나는 그런 일이 일어나기를 원하지 않았다. 이 문제를 피할 수 있습니까?

2)이 doReturn(..에서 주석과 나는 다음과 같은 오류가있어 when(imagesSorter.sor

을 사용했을 때

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 



E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
    when(mock.isOk()).thenReturn(true); 
    when(mock.isOk()).thenThrow(exception); 
    doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, you naughty developer! 

어떻게 당신은 내가 무엇을 원하는 코드 것입니까?

답변

0

여기 모의 작성에 Mockito가 필요하지 않다고 생각합니다. ImageSorter는 구체적인 클래스이기 때문에, 당신은 진정한 장식을 할 수 없습니다,하지만 당신은 같은 것을 할 수 있습니다 : 당신이 정말 Mockito 스파이하려는 경우로서 다음, 그 다음

public class FixedDateImageSorter extends ImagesSorter { 

    final Date fixedDdate; 

    FixedDateImageSorter(Date fixedDate) { 
     this.fixedDdate = fixedDate; 
    } 

    public List sortImages(List s, User u) { 
     return sortImages(s, u, fixedDdate); 
    } 
} 

private ImagesSorter setServerWithSpyImageSorter(User user, List imagesAsInsertionOrder, Date fakeNowDate) throws IOException { 
    ImagesSorter imagesSorter = new FixedDateImageSorter(fakeNowDate); 
    server = VenueServerImplBuilder.create().withImagesSorter(imagesSorter).build(); 
    server.init(); 
    return imagesSorter; 
} 

doReturn가 열심히 평가된다고 말했다. 그래서 요즘 응답을 평가하기 위해 doAnswer를 사용해야합니다 :

import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.spy; 
import static org.mockito.Mockito.doAnswer; 

... 

final Date fakeNowDate = new Date(); 
final ImagesSorter imagesSorter = spy(new ImagesSorter()); 

doAnswer(new Answer<List>() { 
    public List answer(InvocationOnMock invocation) throws Throwable { 
     // Get the actual arguments 
     List arg1 = (List) invocation.getArguments()[0]; 
     User arg2 = (User) invocation.getArguments()[1]; 
     // Then call the 3-args method using fakeNowDate 
     return imagesSorter.sortImages(arg1, arg2, fakeNowDate); 
    } 
}).when(imagesSorter).sortImages(any(List.class), any(User.class)); 

하지만 난 그게 최선의 방법이라고 생각하지 않습니다.

1

이 구문은 스파이 작동하지 않습니다 :

when(imagesSorter.sortImages(imagesAsInsertionOrder, user)).thenReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)); 

당신은이 구조 사용할 필요가 : 여기

doReturn(imagesSorter.sortImages(imagesAsInsertionOrder, user, fakeNowDate)).when(imagesSorter).sortImages(imagesAsInsertionOrder, user)); 

관련 문서 (섹션 참조입니다 "실제 물체를 감시에 중요한 잡았다을!") : http://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#13

+0

링크가 끊어집니다. – Ali

+0

머리를 올려 주셔서 감사합니다. 지금 업데이트되었습니다. – luboskrnac

관련 문제