2014-10-01 4 views
1

У меня есть метод, который опирается на объект «now» Date.Как использовать mockito spy для перенаправления вызова метода?

Я хочу написать для него единичный тест.

Так что я хочу ввести фальшивую дату «сейчас» (чтобы определить тест).

Я попытался придать шпиона, как это:

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 является конкретным классом, вы не можете сделать реальный декоратор, но вы можете сделать что-то вроде:

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; 
} 

Если вы действительно хотите шпион Mockito, то, как вы сказал, что 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

Смежные вопросы