it-swarm.com.ru

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

Я использую инфраструктуру 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();
    }  
}

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

Сбрасывается ложное состояние - test2 завершится ошибкой, если myMock.myMethod () не вызывается

24
Shane

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

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

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

26
Evgeniy Dorofeev
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();
    }

}

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

15
Ørjan Johansen

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

0
Walls