2016-08-04 4 views
2

У меня проблема с Mockito, пытающейся вызвать реальный метод во время stubbing. Я предполагаю, что это может быть связано с тем, что метод наследуется. Это компонент, внешний по отношению к моей системе, и он не может сделать очень много об этом. Но давайте перейдем к кодуMockito называет реальный метод от суперкласса при stubbing

AbstractRpcClient abstractRpcClient = mock(AbstractRpcClient.class); 
doNothing().when(abstractRpcClient).callOnce(anyString(), anyVararg()); 

Так как callOnce методов звонков на некоторых других объектах, которые я получаю NPE прямо во второй строке. AbstractRpcClient наследуется от другого абстрактного класса, но этот класс является локальным, поэтому я даже не могу его отбросить.

Есть ли что-нибудь, что я могу сделать с этим? Как я могу заглушить этот метод, чтобы ничего не делать или исключать исключение БЕЗ вызова реального метода.

Должен ли я расширять этот класс методом проверки и переопределения callOnce? Это, конечно, работает, но есть ли другое решение?

Минимальный пример:

package external.component; 

public abstract class ClassToMock extends SuperClass { 

} 


abstract class SuperClass { 
    public void callOnce(String method, Object... params) { 
     throw new RuntimeException("We shouldn't be here"); 
    } 
} 

Тест класс

package mypackage 

import static org.mockito.Matchers.anyString; 
import static org.mockito.Matchers.anyVararg; 
import static org.mockito.Mockito.doNothing; 
import static org.mockito.Mockito.mock; 

public class Testclass { 

    @Test 
    public void test() { 
     external.component.ClassToMock classToMock = mock(external.component.ClassToMock.class); 
     doNothing().when(classToMock).callOnce(anyString(), anyVararg()); 
    } 

} 

В примере, конечно RuntimeException выбрасывается из callOnce метода.

+1

Пожалуйста, пост [mcve]. Метод не следует здесь вызывать. – Tunaki

+0

Я рекомендую вам взглянуть на эту тему, обсуждая ту же проблему: http://stackoverflow.com/questions/3467801/mockito-how-to-mock-only-the-call-of-a-method-of-the -superclass –

+0

Проблема может быть связана с тем, что 'external.component.ClassToMock' является абстрактным –

ответ

1

Похоже, ошибка в Mockito и на самом деле уже сообщалось, и должен был быть зафиксирован более года назад:

https://github.com/mockito/mockito/issues/168

Я получаю то же самое (сломанный) поведение в версии 1.9.5 и последние 1.10.19.

Я бы порекомендовал вам поднять ошибку с помощью Mockito.

В качестве временного обходного есть несколько вариантов:

  • сделать класс общественного
  • добавить public void callOnce() { super.callOnce(); } в дочернем классе
+0

Спасибо за информацию. Похоже, что это в 2.0-м вехе. Оба класса связаны с внешним компонентом, но я только что создал другой подкласс, который переопределяет этот метод. – Piotr

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