2015-12-11 4 views
3

У меня есть упрощенная версия моей проблемы. Класс A имеет защищенный метод. Класс B наследует этот метод.Mock унаследованный защищенный метод

public class A{ 
    protected String getString(){ 
     //some Code 
    } 
} 


public class B extends A{ 
    public void doSomething(){ 
     //someCode 
     String result = getString(); 
    } 
} 

Я сейчас пишу юнит-тест с Mockito, который находится в другом пакете-тест, и я хочу, чтобы проверить метод doSomething(). Для этого мне нужно высмеять вызов getString(). Поскольку метод защищен и мой тестовый класс находится в пакете differnet, я не могу использовать doReturn(...).when(classUnderTest).getString(). Дело в том, что я шпионить за классом B. Поэтому я не могу использовать mock(new B(), Mockito.CALLS_REAL_METHODS).

Я пытался получать защищенный метод с помощью отражения:

Method getString = classUnderTest.getClass().getDeclaredMethod("getString"); 
getString.setAccessible(true); 

Но я тогда не знаю, как использовать это в doReturn().

+0

Почему вы пытаетесь проверить то, что не в том же пакете, где вы проверяете его? Это может быть первое, что вы хотите исправить. – Makoto

ответ

3

Вы можете использовать «переопределение и подкласс»

B b = new B() { 
    @Override 
    protected String getString() { 
    return "FAKE VALUE FOR TESTING PURPOSES"; 
    }; 
}; 
2

Там может быть чист способом сделать это, но здесь идет ...

  1. Создать макет для «A»
  2. Создайте еще один класс, который расширяет B и переопределяет метод
  3. Марки переопределенный вызов метода макет

Например ...

private A partialMock; 
private B classUnderTest; 

@Before 
public void setup() { 
    partialMock = mock(A.class); 
    classUnderTest = new B() { 
     @Override 
     protected String getString() { 
      return partialMock.getString(); 
     } 
    }; 
} 

@Test 
public void shouldDoSomething() { 

    when(partialMock.toString()).thenReturn("[THE MOCKED RESPONSE]"); 

    classUnderTest.doSomething(); 

    // ...verify stuff... 
} 

Очевидно, вам даже не нужно использовать насмешку, вы можете просто вернуть что-то прямо из переопределенного метода.

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