2014-01-07 1 views
18

Я пытаюсь протестировать некоторый унаследованный код с помощью Mockito, и метод является типом void.Использовать методы Mockito to Stub в том же классе, что и тестируемый класс (CUT)

Я пропустил много вызовов методам в других классах, это прекрасно работает. Тем не менее, мне также нужно уметь вызывать определенные вызовы другим методам внутри одного класса.

В настоящее время это изделие не работает.

например. Мой класс, как показано ниже:

public class Test { 


    public Test(dummy dummy) { 

    } 

    public void checkTask(Task task, List <String> dependencyOnLastSuccessList) throws TaskException { 
     callToOtherClass.method1 // This works fine, I can stub it using mockito 

     updateAndReschedule(Long id, String message) // call to method in same class, I cannot stub it 
    } 

    public void updateAndReschedule(Long id, String message) { 
     //method logic..... 
    } 
} 

Это мой TestClass показывает, что я имею в минуту:

@Test 
public void testMyMethod() { 
    Test testRef = new Test(taskJob); 
    Test spy = spy (testRef); 

    // when a particular method is called, return a specific object 
    when(callToOtherClass.method1).thenReturn(ObjectABC); 

    //doNothing when my local method is called 
    doNothing().when(spy).updateAndReschedule(1, "test");  
    //make method call 
    spy.checkTask(ts, taskDependencies); 

} 

ответ

16

Вы должны instantiante testRef следующим образом:

Test testRef = new Test(taskJob) { 

    public void updateAndReschedule(Long id, String message) { 
     //do nothing 
    } 

}; 

Нет необходимости для шпион.

+0

Brilliant , благодаря. Он работает нормально. Чтобы проверить тест, мне нужно проверить, что метод был вызван, как бы я это сделал, поскольку я не создавал его как класс mockito? – Sudhir

+0

Теперь причуды могут начаться! :) У вас могут быть свои причины, но в большинстве случаев не рекомендуется тестировать интерна вашего класса. Цель теста должна состоять в том, чтобы проверить взаимодействие класса со своей внешностью. Глубоко углубляясь в проверку внутренней структуры, вы получаете тест, который делает рефакторинг более сложным. Но чтобы ответить на ваш вопрос: просто установите переменную в определенное значение из метода overriddden и утвердите для этого. В этом случае переменная должна быть окончательной, поэтому simlpe boolean не будет делать. – fatih

+0

Спасибо, да, это устаревший код, поэтому я не могу его полностью переусердствовать. Как получить значение из метода. Я попытался использовать метод getter, но все еще не смог его увидеть, когда попытался выполнить утверждение, например. private Boolean methodCalled = false; \t public void updateAndReschedule (Long id, String message) { \t \t methodCalled = true; \t} \t \t общественного логический wasMethodCalled() { \t возвращение methodCalled; \t} – Sudhir

3

По-моему, объект-шпион вместо издевки. Spy - это макет, созданный как прокси-сервер существующего реального объекта; некоторые методы могут быть погасили, в то время как unstubbed те, которые направлены на крытый объект

Шпион более изящен, чем анонимная реализация выбранных методов

Посмотрите на примере:

Mockito: Trying to spy on method is calling the original method

в хорошая статья о Mockito Вы можете прочитать

http://refcardz.dzone.com/refcardz/mockito

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