1. 简介

在这个快速教程中,我们将探讨在使用流行测试框架Mockito时可能遇到的一个警告。

具体来说,就是关于已弃用的MockitoJUnitRunner类的警告。我们将了解为什么会显示这个警告以及如何处理它。

最后,请记住,我们可以使用MockitoJUnitRunner来指示Mockito初始化带有@Mock@Spy注解的测试双(test doubles),以及其他Mockito注解。

要了解更多关于使用Mockito进行测试的内容,可以查看我们的Mockito系列文章

2. 为何会出现此警告

如果我们在Mockito 2.2.20版本(2016年11月)之前使用,就会出现这个弃用警告。让我们简要回顾一下其背景。在早期版本的Mockito中,如果我们想使用Mockito JUnit运行器,需要导入的包是:

import org.mockito.runners.MockitoJUnitRunner;

从2.2.20版本开始,与JUnit相关的类被归入一个特定的JUnit包。可以在以下位置找到该包:

import org.mockito.junit.MockitoJUnitRunner;

因此,原始的org.mockito.runners.MockitoJUnitRunner现在被弃用。该类的逻辑现在位于org.mockito.junit.runners.MockitoJUnitRunner中。

虽然移除警告并非强制,但建议这样做。Mockito 3版本将移除这个类。

3. 解决方案

在这一部分,我们将解释三种不同的解决弃用警告的方法:

  • 更新导入语句
  • 使用MockitoAnnotations初始化字段
  • 使用MockitoRule

3.1. 更新导入语句

我们首先从最简单的解决方案开始,即简单地更改包导入语句

import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class ExampleTest {
    //...
}

仅此而已!这个改动应该很容易实现。

3.2. 使用MockitoAnnotations初始化字段

在下一个示例中,我们将以另一种方式使用MockitoAnnotations类初始化我们的mocks

import org.junit.Before;
import org.mockito.MockitoAnnotations;

public class ExampleTest {
    
    @Before 
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
    }

    //...
}

首先,我们去掉对MockitoJUnitRunner的引用,而是调用MockitoAnnotations类的静态initMocks()方法。

我们将在测试类的JUnit @Before方法中执行此操作。这样,每次执行测试前都会初始化带有Mockito注解的字段。

3.3. 使用MockitoRule

然而,正如我们所说,MockitoJUnitRunner并非必需。在最后一个示例中,我们将看看如何通过MockitoRule使@Mock工作

import org.junit.Rule;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

public class ExampleTest {

    @Rule
    public MockitoRule rule = MockitoJUnit.rule();

    //...
}

最后,在这个示例中,JUnit规则会初始化任何带有@Mock注解的mock。

这意味着不再需要显式使用MockitoAnnotations#initMocks(Object)@RunWith(MockitoJUnitRunner.class)

4. 总结

总之,在这篇短文中,我们了解了多种解决MockitoJUnitRunner类弃用警告的方法。