我正在使用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将失败
答案 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对象,那么在每个测试中您可以提供不同的功能。您可以将其初始化一次,并在此之后更改每次测试的行为/期望。