每次测试都会重置Mock对象吗?

时间:2013-05-29 13:59:08

标签: java junit mockito

我正在使用Mockito framework在我的JUnit测试中创建Mock对象。每个模拟器都知道调用了哪些方法,所以在我的测试中我可以编写

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的验证方法已通过

模拟状态被重置 - 如果未调用myMock.myMethod(),test2将失败

3 个答案:

答案 0 :(得分:27)

JUnit每次运行新的测试方法时都会创建一个新的测试类实例,并在每次创建新的测试类时运行@Before方法。你可以轻松测试它

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

MockitoJUnitRunner将为每个测试方法创建一个新的MyMock模拟实例

答案 1 :(得分:15)

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

}

这过去了。如果状态持续,则第二次测试将失败。如果您调试它,您将获得每个测试的模拟对象的新实例。

答案 2 :(得分:0)

如果您只是初始化setup中的Mock对象,那么在每个测试中您可以提供不同的功能。您可以将其初始化一次,并在此之后更改每次测试的行为/期望。