2013-02-26 6 views
7

У меня есть тестовый класс (на основе TestNG), где я использую Mockito.verify для объекта-шпиона.Сброс Mockito Spy

Это работает:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 
} 

Но здесь:

public class Program { 
    @Spy 
    private TestObject testObject; 

    @Test 
    public void test1() { 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     testObject.makeSth(); 
     verify(testObject, only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 

я получаю исключение Mokito, что у меня есть еще, что один вызов метода someMethodNeedToBeChecked. Конечно, я попытался добавить Mockito.reset(testObject), но мне это совсем не помогло.

Как я могу сбросить объект-шпион, если мне нужно проверить один и тот же метод в нескольких тестах?

+0

Я задал подобный вопрос, по меньшей http://programmers.stackexchange.com/questions/188299/is-this-an- целесообразное использование-на-mockitos-сброс-метод. Просто FYI, хотя это связано с ложным не шпионом. –

+0

Где вы пытались добавить вызов к 'reset'? Может быть, отредактируйте свой код, чтобы показать свою попытку, но прокомментировал? –

+0

Я приложил только пример прототипа, сброс, который я попытался сделать в @BeforeMethod \ @BeforeClass, то же самое с @After, даже перед проверкой - это не сработало. Насколько я понимаю, это проблема только со шпионами, а сброс - только для макетов. –

ответ

12

От Mockito documentation:

Переустановка издевается (С 1.8.0)

пользователи Смарт Mockito вряд ли использовать эту функцию, потому что они знают, что это может быть признаком плохих испытаний. Обычно вам не нужно сбросить свои макеты, просто создайте новые макеты для каждого метода тестирования. Вместо сброса(), пожалуйста, подумайте о том, чтобы написать простые, малые и сфокусированные методы тестирования по длительным, чрезмерным тестам. Первый потенциальный запах кода сбрасывается() в середине тестового метода. Вероятно, это означает, что вы слишком много тестируете. Следите за шепотом своих методов тестирования: «Пожалуйста, держите нас маленькими &, ориентированными на одно поведение». Есть несколько потоков об этом в списке рассылки mockito.

Единственная причина, по которой мы добавили метод reset(), - это дать возможность работать с макетами, вложенными в контейнер.

Вы должны, вероятно, просто воссоздать шпиона в @BeforeMethod:

public class Program { 

    private TestObject testObject = new TestObject(); 
    private TestObject spyTestObject; 

    @BeforeMethod 
    public void buildSpy() { 
     spyTestObject = spy(testObject); 
    } 

    @Test 
    public void test1() { 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
    } 

    @Test 
    public void test2() { 
     // Some different scenario 
     spyTestObject.makeSth(); 
     verify(spyTestObject , only()).someMethodNeedToBeChecked(); 
     ... 
    } 
} 
+0

Я не понимаю, почему вы говорите, что каждый тест теперь должен ожидать два вызова. Шпион перестраивается перед каждым методом тестирования. –

+0

Извините, я неправильно понял ваш ответ :-) –

+0

Спасибо, на самом деле это мне помогло, но если вы используете анотации, такие как @InjectMocks и другие, вам также нужно вызвать там initmocks, который кажется не таким прекрасным. –

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