提交 802cb491 编写于 作者: W wizardforcel

2020-06-06 10:39:03

上级 d19da2dc
......@@ -71,7 +71,7 @@ public class MultipleTagsExample
```
我们不能在单个测试计划中同时包含`@IncludeTags``@ExcludeTags注`解。
我们不能在单个测试计划中同时包含`@IncludeTags``@ExcludeTags 注`解。
## 3\. JUnit 5 `@Tag`示例
......
# Mockito 2 教程– JUnit Mockito 示例
# Mockito 2 教程 – JUnit Mockito 示例
> 原文: [https://howtodoinjava.com/mockito/junit-mockito-example/](https://howtodoinjava.com/mockito/junit-mockito-example/)
在本**模拟教程**中,学习了模拟框架的基础知识,如何编写 [junit](https://howtodoinjava.com/junit-4/) 测试以及模拟,样例设置和带有示例的注解。
在本 **mockito 教程**中,学习了 Mockito 框架的基础知识,如何编写 [junit](https://howtodoinjava.com/junit-4/) 测试以及模拟,样例设置和带有示例的注解。
```java
Table of Contents
......@@ -21,8 +21,8 @@ Mockito 是一个开放源代码框架,可让您轻松创建[测试双打](htt
在模拟中,我们通常使用以下类型的测试双打。
* **存根** –是一个对象,该对象对测试期间执行的方法执行具有预定义的返回值。
* **间谍** –与存根相似的对象,但它们另外记录了它们的执行方式。
* **Stubs** –是一个对象,该对象对测试期间执行的方法执行具有预定义的返回值。
* **Spies** –与 Stubs 相似的对象,但它们另外记录了它们的执行方式。
* **模拟** –是在测试期间对方法执行返回值并记录了对这些执行的期望的对象。 如果模拟人收到了他们不期望的电话,并且在验证过程中对其进行了检查,以确保他们收到了所有期望的电话,它们可能会引发异常。
我们可以在测试类中模拟接口和类。 Mockito 还可以在使用 Mockito 注解时帮助产生最少的样板代码。
......@@ -79,7 +79,7 @@ testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
在敲键盘来编写应用和单元测试之前,让我们快速概述有用的 Mockito 注解。
* **@Mock** 用于模拟创建。 它使测试类更具可读性。
* **@Spy** 用于创建间谍实例。 我们可以使用它代替`spy(Object)`方法。
* **@Spy** 用于创建 Spies 实例。 我们可以使用它代替`spy(Object)`方法。
* **@InjectMocks** 用于自动实例化测试对象,并将所有 *@Mock**@Spy* 带注解的字段依赖项注入其中(如果适用)。
* **@Captor** 用于创建参数捕获器
......@@ -215,10 +215,10 @@ public class ApplicationTest
让我们逐步了解以上测试类:
*`@RunWith(MockitoJUnitRunner.class)`注解测试,以便 Mockito 可以处理注解。
* 使用@Mock 注解对 dao 字段进行注解,以为它们两个实例化一个模拟对象。
* 使用@Mock 注解对 dao 字段进行注解,以为它们两个实例化一个 Mocks 对象。
* 使用@InjectMocks 注解对服务字段进行注解,以首先实例化然后注入两个模拟的依赖项。
* 在要测试的类上调用方法进行测试,即。 *recordService*
* 验证模拟对象中的方法已被调用。
* 验证 Mocks 对象中的方法已被调用。
还有许多其他方法可以测试方法和模拟的依赖项,我们将在以后的文章中介绍。
......
......@@ -38,9 +38,9 @@ public void saveTest()
```
#### 1.2 @间谍
#### 1.2 @Spies
**@Spy** 注解用于**创建真实对象并监视该真实对象**间谍程序可以帮助调用对象的所有常规方法,同时仍可以跟踪每次交互,就像使用模拟一样。
**@Spy** 注解用于**创建真实对象并监视该真实对象**Spies 程序可以帮助调用对象的所有常规方法,同时仍可以跟踪每次交互,就像使用模拟一样。
请注意,在给定的示例中,由于我们向其中添加了一个键值对,因此映射的大小如何保持为 1。 我们还可以使用它的键取回添加到映射的值。 在模拟实例中是不可能的。
......@@ -173,6 +173,6 @@ public void saveTest()
参考文献:
[模拟 Java Doc](https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/Mock.html)
[间谍 Java Doc](https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/Spy.html)
[Spies Java Doc](https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/Spy.html)
[Captor Java Doc](https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/Captor.html)
[InjectMocks Java Doc](https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/InjectMocks.html)
\ No newline at end of file
......@@ -4,11 +4,11 @@
在使用 [junit](https://howtodoinjava.com/junit-4/) 和 Mockito 进行[单元测试](https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/)的过程中,我们使用 **@Mock****@InjectMocks** 注解来创建要测试的对象和依赖项。 了解 mockito 中@Mock 和@InjectMocks 注解之间的*区别。*
## 1\. 模拟对象与存根对象之间的区别
## 1\. Mocks 对象与 Stubs 对象之间的区别
重要的是要了解模拟对象与[对象](https://howtodoinjava.com/java/basics/how-to-create-a-class-in-java/)之间的区别。 对象是类的实际实例,使用对象引用调用的任何方法都将执行类文件中定义的方法主体。
重要的是要了解 Mocks 对象与[对象](https://howtodoinjava.com/java/basics/how-to-create-a-class-in-java/)之间的区别。 对象是类的实际实例,使用对象引用调用的任何方法都将执行类文件中定义的方法主体。
模拟对象是用于隐藏无法在测试环境中测试的依赖项的接口。 数据库,网络位置等。使用模拟引用调用的方法不会执行类文件中定义的方法主体,而是使用 **when-thenReturn** 方法组合来配置方法行为。
Mocks 对象是用于隐藏无法在测试环境中测试的依赖项的接口。 数据库,网络位置等。使用模拟引用调用的方法不会执行类文件中定义的方法主体,而是使用 **when-thenReturn** 方法组合来配置方法行为。
在 junit 测试中,我们为需要测试的类和要调用的方法创建对象。 我们为依赖项创建了模拟,这些依赖项不会出现在测试环境中,并且对象依赖于该依赖项来完成方法调用。
......@@ -21,10 +21,10 @@
* 使用@InjectMocks 创建需要在测试类中进行测试的类实例。
* 当需要为给定类执行实际方法主体时,请使用@InjectMocks。
* 当我们需要使用模拟对象初始化的所有内部依赖项以正常工作方法时,请使用@InjectMocks。
* 当我们需要使用 Mocks 对象初始化的所有内部依赖项以正常工作方法时,请使用@InjectMocks。
* 使用@Mock 创建模拟,以支持要测试的类的测试。
* 带有@Mock 注解的带注解的类(待测试)依赖项。
* 我们必须为模拟对象定义 when-thenRetrun 方法,在实际测试执行期间将调用哪些类方法。
* 我们必须为 Mocks 对象定义 when-thenRetrun 方法,在实际测试执行期间将调用哪些类方法。
## 3\. @Mock 和@InjectMocks 示例
......@@ -142,7 +142,7 @@ public void validateTest()
## 4 结论
在此模拟教程中,我们了解了@Mock 和@InjectMocks 注解之间的*区别。 我们了解了在 junit 测试中将这些注解应用于类时发生了什么。*
在此 mockito 教程中,我们了解了@Mock 和@InjectMocks 注解之间的*区别。 我们了解了在 junit 测试中将这些注解应用于类时发生了什么。*
学习愉快!
......
......@@ -67,7 +67,7 @@ public class TestEmployeeManager {
#### 2.2 MockitoAnnotations.initMocks()方法
如果我们不使用 MockitoJUnitRunner 类方法,则可以使用静态方法`MockitoAnnotations.initMocks()`。 在初始化 junit 测试时,该方法还会初始化模拟对象。
如果我们不使用 MockitoJUnitRunner 类方法,则可以使用静态方法`MockitoAnnotations.initMocks()`。 在初始化 junit 测试时,该方法还会初始化 Mocks 对象。
```java
public class TestEmployeeManager {
......@@ -97,7 +97,7 @@ public class TestEmployeeManager {
## 3\. 使用 Mockito 进行 JUnit 测试
让我们看几个例子,这些例子编写了 junit 测试,以使用通过嘲讽创建的模拟对象对服务层方法进行单元测试。
让我们看几个例子,这些例子编写了 junit 测试,以使用通过嘲讽创建的 Mocks 对象对服务层方法进行单元测试。
很少有示例方法是`getAllEmployees()`,该方法将返回`EmployeeVO`对象的列表,`getEmployeeById(int id)`以给定 id 返回雇员。 和`createEmployee()`将添加一个雇员对象并返回`void`
......@@ -275,7 +275,7 @@ public class EmployeeDao {
## 4\. Spring Boot Mockito 示例–结论
在此**模拟教程**中,我们学习了使用 JUnit 和 Mockito 对 Spring Boot 应用中的服务层进行单元测试。 我们学习了如何设置测试类并编写 JUnit 测试。
在此**mockito 教程**中,我们学习了使用 JUnit 和 Mockito 对 Spring Boot 应用中的服务层进行单元测试。 我们学习了如何设置测试类并编写 JUnit 测试。
我们还了解了@Mock 和@InjectMocks 注解之间的**区别。**
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/library/mock-testing-using-powermock-with-junit-and-mockito/](https://howtodoinjava.com/library/mock-testing-using-powermock-with-junit-and-mockito/)
**PowerMock** 是 Java 世界的开源模拟库。 它扩展了现有的模拟框架,例如 [**EasyMock**](http://www.easymock.org/ "easymock")[**Mockito**](https://code.google.com/p/mockito/ "mockito") ,为它们添加了更强大的功能。 PowerMock 使我们能够为最不可测试的代码编写良好的单元测试。 Java 中的大多数模拟框架都不能模拟静态方法或最终类。 但是使用 PowerMock,我们可以模拟几乎任何类。
**PowerMock** 是 Java 世界的开源模拟库。 它扩展了现有的 Mockito 框架,例如 [**EasyMock**](http://www.easymock.org/ "easymock")[**Mockito**](https://code.google.com/p/mockito/ "mockito") ,为它们添加了更强大的功能。 PowerMock 使我们能够为最不可测试的代码编写良好的单元测试。 Java 中的大多数 Mockito 框架都不能模拟静态方法或最终类。 但是使用 PowerMock,我们可以模拟几乎任何类。
PowerMock currently extends the EasyMock and Mockito mocking frameworks. Depending on which extension is preferred, the syntax to write any unit test differs slightly. In this tutorial, I am using PowerMock with Mockito.
......@@ -10,7 +10,7 @@ PowerMock currently extends the EasyMock and Mockito mocking frameworks. Dependi
## 具有依赖项的 PowerMock 安装
PowerMock 是一个正在积极开发的开源模拟框架。 您可以按照以下步骤在计算机中进行设置。
PowerMock 是一个正在积极开发的开源 Mockito 框架。 您可以按照以下步骤在计算机中进行设置。
1)首先下载 PowerMock 1.5。 通过 [http://code.google.com/p/powermock/](https://code.google.com/p/powermock/ "powermock home") 访问 PowerMock 主页。
......@@ -138,7 +138,7 @@ public void firstMockTest()
```
以上测试将成功执行。 在此,当调用`employeeController.getProjectedEmployeeCount()`时,它依次从模拟对象中调用方法`getEmployeeCount()`,该方法返回值 8。控​​制器将其乘以 2,返回值为 16。该返回值等于 assert 语句中的期望值, 因此测试通过了。
以上测试将成功执行。 在此,当调用`employeeController.getProjectedEmployeeCount()`时,它依次从 Mocks 对象中调用方法`getEmployeeCount()`,该方法返回值 8。控​​制器将其乘以 2,返回值为 16。该返回值等于 assert 语句中的期望值, 因此测试通过了。
## 验证是否真的调用了模拟方法?
......@@ -188,7 +188,7 @@ Actually, there were zero interactions with this mock.
## 使用模拟设置获取有关测试运行的更多信息
这些模拟设置很少使用,但在某些情况下很有用。 如果您想为模拟命名,以供将来调试之用,请使用它们。 或者您想启用详细日志记录以获取更多信息。 当您要注册一个监听器来通知该模拟方法的调用时,可以使用它。 甚至在尚未实现实际对象的模拟对象上实现一些额外的接口。
这些模拟设置很少使用,但在某些情况下很有用。 如果您想为模拟命名,以供将来调试之用,请使用它们。 或者您想启用详细日志记录以获取更多信息。 当您要注册一个监听器来通知该模拟方法的调用时,可以使用它。 甚至在尚未实现实际对象的 Mocks 对象上实现一些额外的接口。
```java
@Test
......
......@@ -337,11 +337,11 @@ describe("MathUtils", function() {
```
## 7\. 与茉莉花间谍一起工作
## 7\. 与茉莉花 Spies 一起工作
茉莉具有双重测试功能,称为间谍。 间谍可以对任何函数进行存根,并跟踪对该函数和所有参数的调用。 间谍仅存在于定义它的`describe``it`块中,并且在每个规范后都会被删除。 要使用任何方法创建间谍,请使用`spyOn(object, 'methodName')`调用。
茉莉具有双重测试功能,称为 Spies。 Spies 可以对任何函数进行 Stubs,并跟踪对该函数和所有参数的调用。 Spies 仅存在于定义它的`describe``it`块中,并且在每个规范后都会被删除。 要使用任何方法创建 Spies,请使用`spyOn(object, 'methodName')`调用。
有两个匹配器`toHaveBeenCalled``toHaveBeenCalledWith`应该与间谍一起使用。 如果调用了间谍,则`toHaveBeenCalled`匹配器将返回 true;否则,将返回 true。 如果参数列表与对间谍的任何记录调用匹配,则`toHaveBeenCalledWith`匹配器将返回 true。
有两个匹配器`toHaveBeenCalled``toHaveBeenCalledWith`应该与 Spies 一起使用。 如果调用了 Spies,则`toHaveBeenCalled`匹配器将返回 true;否则,将返回 true。 如果参数列表与对 Spies 的任何记录调用匹配,则`toHaveBeenCalledWith`匹配器将返回 true。
```java
describe("MathUtils", function() {
......@@ -369,9 +369,9 @@ describe("MathUtils", function() {
```
上面的示例本质上是最基本的,您也可以使用间谍来验证对内部方法的调用。 例如。 如果在任何对象上调用方法`calculateInterest()`,则可能需要检查是否必须在该对象内调用`getPrincipal()``getROI()``getTime()`。 间谍将帮助您验证这些假设。
上面的示例本质上是最基本的,您也可以使用 Spies 来验证对内部方法的调用。 例如。 如果在任何对象上调用方法`calculateInterest()`,则可能需要检查是否必须在该对象内调用`getPrincipal()``getROI()``getTime()`。 Spies 将帮助您验证这些假设。
当没有要监视的功能时,`jasmine.createSpy`可以创建裸露的间谍。 该间谍的行为与其他任何间谍一样-跟踪调用,参数等。但是它背后没有实现。 间谍是 JavaScript 对象,可以这样使用。 通常,这些间谍在需要时用作其他函数的回调函数。
当没有要监视的功能时,`jasmine.createSpy`可以创建裸露的 Spies。 该 Spies 的行为与其他任何 Spies 一样-跟踪调用,参数等。但是它背后没有实现。 Spies 是 JavaScript 对象,可以这样使用。 通常,这些 Spies 在需要时用作其他函数的回调函数。
```java
var callback = jasmine.createSpy('callback');
......@@ -392,17 +392,17 @@ tape.play();
```
`calls`属性上跟踪并公开了对间谍的每次调用。 让我们看看如何使用这些属性来跟踪间谍
`calls`属性上跟踪并公开了对 Spies 的每次调用。 让我们看看如何使用这些属性来跟踪 Spies
| 追踪属性 | Purpose |
| .calls.any() | 如果根本没有调用过该间谍,则返回 false;如果至少发生一次调用,则返回 true。 |
| .calls.count() | 返回间谍被调用的次数 |
| .calls.any() | 如果根本没有调用过该 Spies,则返回 false;如果至少发生一次调用,则返回 true。 |
| .calls.count() | 返回 Spies 被调用的次数 |
| .calls.argsFor(index) | 返回传递给电话号码索引的参数 |
| .calls.allArgs() | 返回所有调用的参数 |
| .calls.all() | 返回上下文(`this`),并且参数传递了所有调用 |
| .calls.mostRecent() | 返回上下文(`this`)和最近一次调用的参数 |
| .calls.first() | 返回第一次调用的上下文(`this`)和参数 |
| .calls.reset() | 清除所有跟踪以发现间谍 |
| .calls.reset() | 清除所有跟踪以发现 Spies |
## 8\. 茉莉花教程–最终想法
......
......@@ -24,7 +24,7 @@ Android app project structure
## 2)Java 源代码
创建项目时(例如,通过 android create project),您为应用(例如`com.howtodoinjava.DemoApp`)提供了“ **main** ”活动的全限定类名。 然后,您会发现项目的 src /树已经安装了包的目录树,还有代表您的主要活动的存根 Activity 子类(例如 **`src/com/howtodoinjava/DemoAppMainActivity.java`** )。 欢迎您修改此文件,并根据需要将其他文件添加到 src /树中,以实现您的应用。
创建项目时(例如,通过 android create project),您为应用(例如`com.howtodoinjava.DemoApp`)提供了“ **main** ”活动的全限定类名。 然后,您会发现项目的 src /树已经安装了包的目录树,还有代表您的主要活动的 Stubs Activity 子类(例如 **`src/com/howtodoinjava/DemoAppMainActivity.java`** )。 欢迎您修改此文件,并根据需要将其他文件添加到 src /树中,以实现您的应用。
首次在项目包的目录中编译该项目时,Android 构建链将创建`R.java`。 它包含许多与您在 res /目录树中放置的各种资源相关联的常量。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册