мокито-версия: 1.9.0
Я хочу настроить вызов метода издевательского объекта в mockito без вызова самого исходного метода:
РЕДАКТИРОВАТЬ: этот пример на самом деле работает так, как ожидалось, то есть метод тела "test()" не выполняется. Однако после дальнейшего изучения я заметил, что исходный метод имел модификатор видимости по умолчанию, и я подозреваю, что это вызывает проблемы, поскольку после изменения его на общедоступный (разве это не должно быть таким же?!) он работает, как и ожидалось.
e.g.
public class TestClass {
public String test() {
System.out.println("test called!");
return "test";
}
}
//in test
TestClass mock = mock(TestClass.class);
when(mock.test()).thenReturn("mock!"); //<-- prints test called here? why? how can I switch it off?
Ответ 1 · рейтинг 8 · Tom Tresansky
Следующее, работающее под Mockito 1.9.0 и JUnit 4.8.2, не ничего не выводит на мою консоль:
import static org.mockito.Mockito.*;
import org.junit.Test;
public class TestNonCall {
public class TestClass {
public String test() {
System.out.println("test called!");
return "test";
}
}
@Test
public void doTest() {
final TestClass mock = mock(TestClass.class);
when(mock.test()).thenReturn("mock!");
}
}
Кроме того, если я поставлю точку останова в методе test(), она никогда не сработает.
Возможно, разместить больше кода? Похоже, ваш пример недостаточно сложен, чтобы продемонстрировать поведение, с которым у вас возникли проблемы.
Также: вы используете последнюю версию Mockito?
Изменить: Новая мысль: вы издеваетесь над окончательным методом?
Если вы добавите модификатор final к методу, который вы имитируете, вы получите поведение, о котором сообщали.
Это связано с тем, что Mockito не имитирует окончательные и статические методы. Вместо этого он делегирует вызовы реальной реализации.
Может ли ваш реальный код пытаться имитировать окончательный метод?
Если это так, вы можете использовать PowerMock, который является расширением Mockito, которое позволяет имитировать окончательные методы.
Вам нужно будет добавить следующие аннотации к вашему тестовому классу:
@RunWith(PowerMockRunner.class)
@PrepareForTest(TestClass.class)
public class TestNonCall {
// ...
}
и смоделируйте класс, используя метод PowerMock в вашем тестовом методе:
final TestClass mock = PowerMockito.mock(TestClass.class);
затем продолжайте как обычно.