Переопределить операторы Mockito в локальной функции не работает в режиме PER CLASS?
Я новичок в JUnit5 и заметил что-то странное.
Давайте посмотрим на это на примере,
У меня есть исходный класс с именем A
class A {
someDownStreamService service;
void printer() {
int getData = service.getIntegerData();
print(getData);
}
}
Теперь, когда я написал тестовый пример,
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class JUnit5TestCaseForClassA {
@Mock
private someDownStreamService service;
@InjectMocks
private A a;
@BeforeEach
setUp() {
initMocks(this);
Mockito.when(service.getIntegerData()).thenReturn(25);
}
@Test
void test1() {
a.printer();
}
@Test
void test2() {
Mockito.when(service.getIntegerData()).thenReturn(19);
a.printer();
}
}
Когда я запускаю test2() по отдельности, функция printer() печатает 19, так как я предполагаю, что оператор Mockito.when() переопределяется, чтобы возвращать 19 в функции test2() по сравнению с тем, что было зарегистрировано в @BeforeEach, чтобы возвращать 25.
И когда я выполняю все тестовые классы в классе 'JUnit5TestCaseForClassA', я вижу, что функция printer() печатает 25 для обеих этих тестовых функций. Не происходит ли переопределение? Или в чем проблема?
Почему это несоответствие?????
Я вижу, что создание @TestInstance(TestInstance.Lifecycle.METHOD) решит проблему, так как каждый тестовый сценарий запускается с новым экземпляром теста. Но я хочу проверить с Lifecycle.PER_CLASS.
1 ответ
Я немного изменил ваш пример, чтобы сделать его тестируемым (с утверждениями) следующим образом.
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.mockito.InjectMocks;
import org.mockito.Mock;
@TestInstance(Lifecycle.PER_CLASS)
public class MockitoJUnitJupiterTestCase {
@Mock
MyService service;
@InjectMocks
A a;
@BeforeEach
void setUp() {
initMocks(this);
when(service.getData()).thenReturn(25);
}
@Test
void test1() {
assertEquals("data: 25", a.printer());
}
@Test
void test2() {
when(service.getData()).thenReturn(19);
assertEquals("data: 19", a.printer());
}
}
interface MyService {
int getData();
}
class A {
MyService service;
String printer() {
return "data: " + service.getData();
}
}
Когда я выполняю это с использованием снимков Mockito 2.23.4 или 2.28.2 и JUnit Jupiter 5.5, тесты проходят.
Можете ли вы попробовать этот вариант ваших тестов и сообщить нам, пройдут ли оба теста при выполнении всего класса тестирования?