现在(从v1.10.7开始),有第四种实例化模拟的方法,它使用了一个称为MockitoRule的JUnit4 规则。@RunWith(JUnit4.class) // or a different runner of your choicepublic 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运行器都支持注释和使用验证。
有一种整齐的方法可以做到这一点。如果是单元测试,则可以执行以下操作:@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() { }}