Переопределить операторы 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, тесты проходят.

Можете ли вы попробовать этот вариант ваших тестов и сообщить нам, пройдут ли оба теста при выполнении всего класса тестирования?

Другие вопросы по тегам