Я думаю, что, возможно, нашел ошибку в JMockit, но я хотел бы, чтобы кто-нибудь подтвердил, является ли это ошибкой или я что-то упускаю.
У меня есть следующий (очень простой) класс:
public class Dummy {
public void foo() {System.out.println("O");}
}
Теперь у меня есть следующие тесты, в каждом из которых я пытаюсь смоделировать метод 'foo' более одного раза (каждый тест делает это немного по-своему):
Тест №1
@Test
public void test1() {
new MockUp<Dummy>() {
@Mock
public void foo(Invocation inv) {
System.out.println("A");
inv.proceed();
}
}
new MockUp<Dummy>() {
@Mock
public void foo(Invocation inv) {
System.out.println("B");
inv.proceed();
}
}
new Dummy().foo();
}
Тест №2
@Test
public void test2() {
mock("A");
mock("B");
new Dummy().foo();
}
private void mock(final String s) {
new MockUp<Dummy>() {
@Mock
public void foo(Invocation inv) {
System.out.println(s);
inv.proceed();
}
}
}
Единственная разница между тестами заключается в извлечении фиктивного кода другим методом. Но результаты не те...
Выход теста №1:
B
A
B
O
Это странно, потому что я не ожидал, что A вообще появится. Но в любом случае, вот результат теста №2:
B
A
A
A
...ad infinitum
Тест № 2 завершится с ошибкой StackOverflowError.
Это ошибка или я что-то упускаю?
Обновить (с решением)
Как упомянул @Rogério, такое поведение неприемлемо.
Тогда как можно переопределить макет? как это:
private MockUp<Dummy> mock;
@Test
public void test3() {
mockCorrectly("A");
mockCorrectly("B");
new Dummy().foo();
}
private void mockCorrectly(final String s) {
if (mock != null) {
mock.tearDown();
}
mock = new MockUp<Dummy> {
@Mock
public void foo(Invocation inv) {
System.out.println(s);
inv.proceed();
}
}
}
И для вывода:
B
O
Большой :)