2013-05-29 43 views
16

我正在使用Mockito framework在我的JUnit测试中创建Mock对象。每个模拟知道什么方法被调用就可以了,所以在我的测试,我可以写做模拟对象得到重置为每个测试?

verify(myMock, atLeastOnce()).myMethod(); 

我想知道的是什么已经叫这个内部模拟知识会在我的测试中仍然存在?如果它仍然存在,那么在两次测试中使用相同的verify方法时,我可能会得到误报。

A码示例

@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

如果我没有错,在所有测试之前设置被调用一次...所以是的,所有的测试都使用相同的模拟对象。您需要在每种测试方法开始时创建该对象 –

回答

20

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

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

而且MockitoJUnitRunner会为每个测试方法

+8

这是正确的。 ** JUnit **设计者希望在测试方法之间进行测试隔离,因此它创建了一个新的测试类实例来运行每种测试方法。请注意,** TestNG **创建者采取了不同的方式,并为每个测试类选择了隔离,这意味着TestNG测试的测试方法之间没有隔离。因此,实例模拟可能需要在每种测试方法之间重新设置。 – Brice

+0

当使用单例时,这是一个很大的问题,因为模拟只适用于第一次测试... –

+0

你有没有发现有记录的地方?我已经知道这是真实的一段时间,但有人问我后,我一直在搜索,似乎无法在任何地方的文档中找到它。 – dsingleton

0

如果您只是在setup中初始化模拟对象,那么在每次测试中您都可以提供不同的功能。您可以初始化一次,然后改变它们在每次测试中的行为/期望值。

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

} 

这通过创建一个新的MyMock模拟实例。如果国家坚持下去,那么第二次测试就会失败。如果你调试它,你会认为你得到了每个测试的模拟对象的新实例。

+0

是的,同意,如果使用@RunWith(MockitoJUnitRunner.class),将会注入新的mock。 – yuranos87