3 回答
TA贡献1828条经验 获得超3个赞
现在(从v1.10.7开始),有第四种实例化模拟的方法,它使用了一个称为MockitoRule的JUnit4 规则。
@RunWith(JUnit4.class) // or a different runner of your choice
public class YourTest
@Rule public MockitoRule rule = MockitoJUnit.rule();
@Mock public YourMock yourMock;
@Test public void yourTestMethod() { /* ... */ }
}
JUnit查找以@Rule注释的TestRule的子类,并使用它们包装Runner提供的测试语句。这样的结果是您可以提取@Before方法,@ After方法,甚至尝试...将包装器捕获到规则中。您甚至可以在您的测试中与这些交互,就像ExpectedException一样。
MockitoRule的行为几乎与MockitoJUnitRunner完全一样,除了可以使用任何其他运行程序,例如Parameterized(允许测试构造函数接受参数,以便测试可以多次运行)或Robolectric的测试运行程序(因此其类加载器可以提供Java替换)适用于Android本机类)。这使得在最新的JUnit和Mockito版本中使用时更加灵活。
综上所述:
Mockito.mock():直接调用,没有注释支持或使用验证。
MockitoAnnotations.initMocks(this):支持注释,无使用验证。
MockitoJUnitRunner:注释支持和使用验证,但是您必须使用该运行器。
MockitoRule:任何JUnit运行器都支持注释和使用验证。
TA贡献1895条经验 获得超3个赞
有一种整齐的方法可以做到这一点。
如果是单元测试,则可以执行以下操作:
@RunWith(MockitoJUnitRunner.class)
public class MyUnitTest {
@Mock
private MyFirstMock myFirstMock;
@Mock
private MySecondMock mySecondMock;
@Spy
private MySpiedClass mySpiedClass = new MySpiedClass();
// It's gonna inject the 2 mocks and the spied object per reflection to this object
// The java doc of @InjectMocks explains it really well how and when it does the injection
@InjectMocks
private MyClassToTest myClassToTest;
@Test
public void testSomething() {
}
}
编辑:如果这是一个集成测试,则可以执行此操作(不打算与Spring一起使用。仅演示您可以使用不同的Runners初始化模拟):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("aplicationContext.xml")
public class MyIntegrationTest {
@Mock
private MyFirstMock myFirstMock;
@Mock
private MySecondMock mySecondMock;
@Spy
private MySpiedClass mySpiedClass = new MySpiedClass();
// It's gonna inject the 2 mocks and the spied object per reflection to this object
// The java doc of @InjectMocks explains it really well how and when it does the injection
@InjectMocks
private MyClassToTest myClassToTest;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSomething() {
}
}
添加回答
举报