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

Sha*_*ane 27 java junit mockito

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

verify(myMock, atLeastOnce()).myMethod();
Run Code Online (Sandbox Code Playgroud)

我想知道这个内部的模拟知识是否会在我的测试中持续存在?如果它确实存在,那么当我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();
    }  
}
Run Code Online (Sandbox Code Playgroud)

模拟状态是持久的 - test2将通过,因为test1的验证方法已通过

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

Evg*_*eev 29

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

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

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

  • 这是对的.**JUnit**设计人员希望在测试方法之间进行测试隔离,因此它会创建测试类的新实例来运行每个测试方法.请注意,**TestNG**创建者采用了不同的方式,并选择了每个测试类的隔离,这意味着TestNG测试的测试方法之间没有隔离.因此,可能需要在每个测试方法之间重置实例模拟. (11认同)
  • 这在使用单例时是一个大问题,因为模拟只对第一次测试是正确的...... (2认同)
  • 你有没有找到任何记录这一点的地方?我已经知道这是真的有一段时间了,但在有人问我之后,我一直在搜索,但似乎无法在任何地方的文档中找到它。 (2认同)

Ørj*_*sen 16

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

}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,同意,如果使用 @RunWith(MockitoJUnitRunner.class),将注入新的模拟。 (2认同)