2016-05-31 2 views
0

У меня есть следующий класс, который я пытаюсь проверить:Игнорировать метод родительского класса в модульном тестировании с Mockito

public class ClassA extends ClassB { 
    ... 
    public String methodToBeTested(){ 
    methodA1(); 
    methodB(); 
    return something; 
    } 
    ... 
} 

methodB является метод родительского класса. Я хочу игнорировать этот метод или просто его заглушить. Я пытаюсь следующий более и менее:

public class TestClassA{ 
    @Mock 
    ClassB instanceB; 

    public String testTheMethodToBeTested{ 
    doNothing().when(instanceB).methodB(); 
    ClassA instanceA = new ClassA(); 
    String result = instanceA.methodToBeTested(); 
    String expected = "foo" 
    assertTrue(result.equals(expected)); 
    } 
    ... 
} 

Однако я вижу, что methodB все еще выполняется. Однако в ClassA, если я объявляю переменную classB и ее setter; и вместо methodB() напишите classB.methodB() мои тесты выполняются. Но меня просят не менять тестируемый код. Есть ли способ проверить ClassA?

+0

Итак, вы создаете макет 'ClassB', а затем экземпляр класса ClassA ... почему вы ожидаете, что макет' ClassB' имеет отношение к вашему экземпляру 'ClassA'? Просто создайте шпион для 'ClassA' и при использовании' doNothing(). When (instanceA) .methodB(); '. – Tom

+0

Я очень новичок в модульном тестировании и Java, поэтому я не ожидал ничего, кроме чуда из-за отчаяния. Я попробую то, что вы рекомендовали. Огромное спасибо. – newzad

+1

Подсказка: ваш код является хорошим примером, почему многие люди утверждают, что вам следует предпочесть композицию над наследованием. Если ваш класс A содержит B (вместо его расширения), вы можете использовать инъекцию зависимостей и вставлять в B тестовый объект B в A ... и вам не нужно будет попадать в Spy-бизнес. Я не говорю, что ваш дизайн по своей сути ошибочен; но, вероятно, стоит рассмотреть его со своими сверстниками. – GhostCat

ответ

0

Вы можете использовать @Spy (http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#13).

public class TestClassA{ 

    @Rule 
    public MockitoRule rule = MockitoJUnit.rule(); 

    @Spy 
    ClassA instanceA; 

    public String testTheMethodToBeTested{ 
    doNothing().when(instanceA).methodB(); 
    String result = instanceA.methodToBeTested(); 
    String expected = "foo" 
    assertTrue(result.equals(expected)); 
    } 
    ... 
} 

Вы не инстанцирование экземпляра ClassB из-за наследства, но Mockito позволяет следить за реальные объекты тоже.

+0

Nope. methodB все еще выполняется. Но спасибо. – newzad

+0

Я забыл '@ Rule', добавил его сейчас. Можете ли вы попробовать еще раз? Тот же образец работает для меня – ThanksForAllTheFish

+0

Похоже, что вызов конструктора instanceA (должен быть '@Spy ClassA instanceA = new ClassA();') отсутствует в коде ответа. Или просто отбросьте аннотации и правило и используйте 'ClassA instanceA = Mockito.spy (новый ClassA()); –

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