Mock 对象是否会为每次测试重置?

2022-08-31 22:30:25

我正在使用Mockito框架在我的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 将失败


答案 1

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

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

并将为每个测试方法创建一个新的模拟实例。MockitoJUnitRunnerMyMock


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

}

这过去了。如果状态持续存在,则第二次测试将失败。如果对其进行调试,则会看到每个测试都获得模拟对象的新实例。


推荐