Класс Mock в классе под тестированием
Как я могу издеваться над другими классами в классе, которые тестируются?
Например:
MyClass.java
class MyClass {
public boolean performAnything() {
AnythingPerformerClass clazz = new AnythingPerformerClass();
return clazz.doSomething();
}
}
AnythingPerformerClass.java
class AnythingPerformerClass {
public boolean doSomething() {
//very very complex logic
return result;
}
}
И тест:
@Test
public void testPerformAnything() throws Exception {
MyClass clazz = new MyClass();
Assert.assertTrue(clazz.performAnything());
}
Могу ли я подделать AnythingPerformerClass
для исключения ненужной логики из AnythingPerformerClass
? Могу ли я переопределить doSomething()
для простого возврата true
или false
?
Почему я указываю Mockito, потому что мне это нужно для тестирования Android с помощью Robolectric.
Ответы
Ответ 1
Вы можете реорганизовать MyClass
так, чтобы он использовал инъекцию зависимостей. Вместо того, чтобы создать экземпляр AnythingPerformerClass
вы могли бы передать экземпляр класса конструктору MyClass
следующим образом:
class MyClass {
private final AnythingPerformerClass clazz;
MyClass(AnythingPerformerClass clazz) {
this.clazz = clazz;
}
public boolean performAnything() {
return clazz.doSomething();
}
}
Затем вы можете передать макетную реализацию в модульном тесте
@Test
public void testPerformAnything() throws Exception {
AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class);
MyClass clazz = new MyClass(mockedPerformer);
...
}
Кроме того, если ваш AnythingPerformerClass
содержит состояние, вы можете передать AnythingPerformerClassBuilder
в конструктор.
Ответ 2
Поскольку в настоящее время (как декларация, так и создание экземпляра AnythingPerformerClass
внутри метода, не возможно высмеять AnythingPerformerClass
используя только Mockito.
Если возможно, переместите как объявление, так и экземпляр AnythingPerformerClass
на уровень класса: объявите переменную экземпляра типа AnythingPerformerClass
и создайте ее конструктором.
Таким образом, вы можете более легко ввести макет AnythingPerformerClass
во время теста и указать его поведение. Например:
when(anythingPerformerClassMock.doSomething()).thenReturn(true);
или для проверки обработки ошибок:
when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException());
Ответ 3
Вы можете установить, что вернуть в Мокито.
when(mock.method()).thenReturn(someValue)