44

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

4

3 回答 3

54

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

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

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

于 2013-05-29T14:19:44.480 回答
18
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();
    }

}

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

于 2013-05-29T14:25:09.390 回答
1

如果您只是在 中初始化 Mock 对象setup,那么在每个测试中您可以提供不同的功能。您可以对其进行一次初始化,然后更改它们在每次测试后的行为/预期方式。

于 2013-05-29T14:19:24.400 回答