Получают ли объекты Mock reset для каждого теста?

Я использую структуру Mockito для создания объектов Mock в моих тестах JUnit. Каждый макет знает, какие методы были вызваны на него, поэтому во время моих тестов я могу написать

verify(myMock, atLeastOnce()).myMethod();

Мне интересно, сохранится ли это внутреннее издевательство над тем, что он назвал, в моих тестах? Если он сохраняется, тогда я могу получать ложные срабатывания при использовании одного и того же метода verify в двух тестах.

Пример кода

@RunWith(MockitoJUnitRunner.class)
public class EmrActivitiesImplTest {

    @Mock private MyClass myMock;

    @Before
    public void setup() {
        when(myMock.myMethod()).thenReturn("hello");
    }

    @Test
    public void test1() {
        // ..some logic
        verify(myMock, atLeastOnce()).myMethod();
    }

    @Test
    public void test2() {
        // ..some other logic
        verify(myMock, atLeastOnce()).myMethod();
    }  
}

Состояние mock сохраняется - test2 будет проходить независимо, поскольку проверенный метод проверки test

Состояние mock reset - test2 не будет работать, если myMock.myMethod() не вызван

Ответ 1

JUnit создает новый экземпляр тестового класса при каждом запуске нового метода тестирования и запускает метод @Before каждый раз, когда он создает новый тестовый класс. Вы можете легко протестировать его

@Before
public void setup() {
        System.out.println("setup");
        when(myMock.myMethod()).thenReturn("hello");
}

И MockitoJUnitRunner создаст новый экземпляр Mock для MyMock для каждого метода тестирования

Ответ 2

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class sandbox {

    @Mock
    private MyClass myMock;

    @Before
    public void setup() {
        when(myMock.myMethod()).thenReturn("hello");
    }

    @Test
    public void test1() {
        myMock.myMethod();
        verify(myMock, times(1)).myMethod();
    }

    @Test
    public void test2() {
        myMock.myMethod();
        verify(myMock, times(1)).myMethod();
    }

}

Это проходит. Если состояние сохранится, то второе испытание потерпит неудачу. Если вы отлаживаете его, вы можете получить новый экземпляр издевающегося объекта для каждого теста.

Ответ 3

Если вы просто инициализируете объекты Mock в setup, то внутри каждого теста вы можете предоставить различные функции. Вы можете инициализировать его один раз и изменить, как они действуют/ожидаются за каждый тест после этого.