- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在编写新的 jUnit4 测试时,我想知道是使用 @RunWith(MockitoJUnitRunner.class)
还是 MockitoAnnotations.initMocks(this)
。
我创建了一个新测试,向导使用 Runner 自动生成了一个测试。 MockitoJUnitRunner 的 Javadocs 声明如下:
Compatible with JUnit 4.4 and higher, this runner adds following behavior:
Initializes mocks annotated with Mock, so that explicit usage of MockitoAnnotations.initMocks(Object) is not necessary. Mocks are initialized before each test method.Validates framework usage after each test method.
我不清楚使用 Runner 是否比我过去使用的 initMocks()
方法有任何优势。
最佳答案
MockitoJUnitRunner
为您提供框架使用的自动验证,以及自动 initMocks()
。
框架使用的自动验证确实值得拥有。如果您犯了这些错误之一,它会为您提供更好的报告。
您调用静态 when
方法,但未使用匹配的 thenReturn
、thenThrow
或 完成 stub >然后
。 (下面代码中的错误 1)
您在模拟上调用 verify
,但忘记提供方法调用您正在尝试验证。 (下面代码中的错误 2)
您在 doReturn
、doThrow
或doAnswer
并传递一个模拟,但忘记提供该方法你正在尝试 stub 。 (下面代码中的错误 3)
如果您没有对框架使用情况进行验证,则在以下调用 Mockito 方法之前不会报告这些错误。这可能是
如果它们发生在您运行的最后一个测试中(如下面的错误 3),则根本不会报告它们。
以下是每种类型的错误的外观。假设 JUnit 按此处列出的顺序运行这些测试。
@Test
public void test1() {
// ERROR 1
// This compiles and runs, but it's an invalid use of the framework because
// Mockito is still waiting to find out what it should do when myMethod is called.
// But Mockito can't report it yet, because the call to thenReturn might
// be yet to happen.
when(myMock.method1());
doSomeTestingStuff();
// ERROR 1 is reported on the following line, even though it's not the line with
// the error.
verify(myMock).method2();
}
@Test
public void test2() {
doSomeTestingStuff();
// ERROR 2
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call to verify. But Mockito can't report
// it yet, because the call to the method that's being verified might
// be yet to happen.
verify(myMock);
}
@Test
public void test3() {
// ERROR 2 is reported on the following line, even though it's not even in
// the same test as the error.
doReturn("Hello").when(myMock).method1();
// ERROR 3
// This compiles and runs, but it's an invalid use of the framework because
// Mockito doesn't know what method call is being stubbed. But Mockito can't
// report it yet, because the call to the method that's being stubbed might
// be yet to happen.
doReturn("World").when(myMock);
doSomeTestingStuff();
// ERROR 3 is never reported, because there are no more Mockito calls.
}
现在当我五年多前第一次写这个答案时,我写了
So I would recommend the use of the
MockitoJUnitRunner
wherever possible. However, as Tomasz Nurkiewicz has correctly pointed out, you can't use it if you need another JUnit runner, such as the Spring one.
我的建议现在已更改。自从我第一次写这个答案以来,Mockito 团队添加了一个新功能。这是一个 JUnit 规则,它执行与 MockitoJUnitRunner
完全相同的功能。但这样更好,因为它不排除其他运行者的使用。
包括
@Rule
public MockitoRule rule = MockitoJUnit.rule();
在你的测试课上。这会初始化模拟,并自动执行框架验证;就像 MockitoJUnitRunner
一样。但是现在,您也可以使用 SpringJUnit4ClassRunner
或任何其他 JUnitRunner。从 Mockito 2.1.0 开始,有更多选项可以准确控制报告的问题类型。
关于java - @RunWith(MockitoJUnitRunner.class) 与 MockitoAnnotations.initMocks(this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10806345/
我正在尝试使用 @InjectMocks 和 @Mock 进行单元测试。 @RunWith(MockitoJUnitRunner.class) public class ProblemDefiniti
这个问题在这里已经有了答案: Initialising mock objects - Mockito (8 个答案) 关闭 6 年前。 我正在使用 Junit 4.8.2。当我使用 @RunWith
这个问题在这里已经有了答案: @RunWith(MockitoJUnitRunner.class) vs MockitoAnnotations.initMocks(this) (2 个答案) 关闭
我编写了一个 Spring Boot 应用程序,我能够使用 MockMvc 访问和测试 Controller。问题是在测试期间没有强制执行安全性,我可以在没有用户的情况下访问 Controller。
我尝试在 Mockito 的单元测试中使用游标,但 getCount() 方法始终返回 0,即使我添加了一行。有人可以帮助我吗? final Cursor cursor = new MatrixCur
我正在尝试使用 @Mock 编写测试和 @Captor注释。但是,对象没有被创建,所以我得到 NullPointerExceptions . 考试: @RunWith(MockitoJUnitRunn
我需要测试parserService。不幸的是,它表明 RecordDao 对象应该是 Autowired 的,但事实并非如此,在运行测试时它仍然是 null 。如何解决? 解析器 Controlle
当我使用 MockitoJunitRunner 测试以下函数时,它按预期工作正常。但是当我使用 PowerMockRunner 运行相同的测试时,出现以下异常: org.jasypt.exceptio
我的测试正在使用 @RunWith(MockitoJUnitRunner.class) annotation,在 Java 6 中运行良好,但升级到 Java 8 后,测试开始失败,并出现以下异常。这
我们正在使用 Testng 6.8.8 + Mockito 1.10.19,显然我们不能使用 MockitoJUnitRunner,但验证框架仍然有效!在这个thread我读到它不应该是这样的。有人可
下面的例子是正确的。问题是我确实需要 @InjectMocks 注释。当我将 SpringJUnit4ClassRunner.class 替换为 MockitoJUnitRunner.class 时,
我一直在尝试在测试类中使用配置属性,但找不到方法,因为我总是遇到 NullPointerException。 application.yaml affix: lover: 'interests'
我对 SpringJUnit4ClassRunner 的用法有疑问。对于纯 Junit 或单元测试用例,我们应该使用基于 Spring 的注释,例如 @Autowired 和 SpringJUnit4
在编写新的 jUnit4 测试时,我想知道是使用 @RunWith(MockitoJUnitRunner.class) 还是 MockitoAnnotations.initMocks(this)。 我
我正在启动一个新的 Dropwizard 项目,但无法使用 MockitoJUnitRunner 运行测试。 我能够运行主应用程序。所以,我猜测这不是 JRE/JDK 问题。 以下是我的项目中的一些文
我使用 @RunWith(MockitoJUnitRunner.class) 与mockito 进行 junit 测试。但现在我正在使用 spring boot 应用程序并尝试使用 @RunWith(
在通常使用 @Mock 和 @InjectMocks 注释的模拟中,被测类应该使用 @RunWith(MockitoJUnitRunner.class)。 @RunWith(MockitoJUnitR
@RunWith(MockitoJUnitRunner.class) 和 @RunWith(SpringJUnit4ClassRunner.class) 有什么区别?什么时候合适使用它? 最佳答案 M
我刚刚将我的项目从 Spring Boot 2.1 迁移到 2.3,因此现在有了 JUnit 5(带有复古)(还包括版本 3.3.3 的 mockito-core 和 mockito-junit-ju
我是一名优秀的程序员,十分优秀!