Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
howtodoinjava-zh
提交
c400f7bf
H
howtodoinjava-zh
项目概览
OpenDocCN
/
howtodoinjava-zh
大约 1 年 前同步成功
通知
1
Star
82
Fork
8
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
howtodoinjava-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c400f7bf
编写于
6月 06, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-06-06 10:46:18
上级
802cb491
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
88 addition
and
87 deletion
+88
-87
docs/misc/207.md
docs/misc/207.md
+22
-21
docs/misc/208.md
docs/misc/208.md
+16
-16
docs/misc/209.md
docs/misc/209.md
+21
-21
docs/misc/211.md
docs/misc/211.md
+14
-14
docs/misc/213.md
docs/misc/213.md
+4
-4
docs/misc/267.md
docs/misc/267.md
+10
-10
docs/misc/273.md
docs/misc/273.md
+1
-1
未找到文件。
docs/misc/207.md
浏览文件 @
c400f7bf
...
...
@@ -21,9 +21,9 @@ Mockito 是一个开放源代码框架,可让您轻松创建[测试双打](htt
在模拟中,我们通常使用以下类型的测试双打。
*
**Stub
s**
–
是一个对象,该对象对测试期间执行的方法执行具有预定义的返回值。
*
**Sp
ies**
–与 Stubs
相似的对象,但它们另外记录了它们的执行方式。
*
**
模拟**
–
是在测试期间对方法执行返回值并记录了对这些执行的期望的对象。 如果模拟人收到了他们不期望的电话,并且在验证过程中对其进行了检查,以确保他们收到了所有期望的电话,它们可能会引发异常。
*
**Stub
**
–
是一个对象,该对象对测试期间执行的方法执行具有预定义的返回值。
*
**Sp
y**
– 与 Stub
相似的对象,但它们另外记录了它们的执行方式。
*
**
Mock**
–
是在测试期间对方法执行返回值并记录了对这些执行的期望的对象。 如果模拟人收到了他们不期望的电话,并且在验证过程中对其进行了检查,以确保他们收到了所有期望的电话,它们可能会引发异常。
我们可以在测试类中模拟接口和类。 Mockito 还可以在使用 Mockito 注解时帮助产生最少的样板代码。
...
...
@@ -78,18 +78,18 @@ testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
在敲键盘来编写应用和单元测试之前,让我们快速概述有用的 Mockito 注解。
*
**@Mock**
用于模拟创建。 它使测试类更具可读性。
*
**@Spy**
用于创建 Spies
实例。 我们可以使用它代替
`spy(Object)`
方法。
*
**@InjectMocks**
用于自动实例化测试对象,并将所有
*@Mock*
或
*@Spy*
带注解的字段依赖项注入其中(如果适用)。
*
**@Captor**
用于创建参数捕获器
*
`@Mock`
用于模拟创建。 它使测试类更具可读性。
*
`@Spy`
用于创建 Spy
实例。 我们可以使用它代替
`spy(Object)`
方法。
*
`@InjectMock`
用于自动实例化测试对象,并将所有
`@Mock`
或
`@Spy`
带注解的字段依赖项注入其中(如果适用)。
*
`@Captor`
用于创建参数捕获器
> 阅读更多: [
@Mock 和@InitMocks 注解之间的区别](https://howtodoinjava.com/mockito/mockito-mock-initmocks
/)
> 阅读更多: [
`@Mock`和`@InitMock`注解之间的区别](https://howtodoinjava.com/mockito/mockito-mock-initMock
/)
要处理所有上述注解,
请
**MockitoAnnotations.initMocks(testClass);**
必须至少使用一次。 要处理注解,我们可以使用内置运行器
**MockitoJUnitRunner**
或规则
**MockitoRule**
。 我们还可以在
`@Before`
带注解的 Junit 方法中显式调用
`initMocks
()`
方法。
要处理所有上述注解,
`MockitoAnnotations.initMock(testClass);`
必须至少使用一次。 要处理注解,我们可以使用内置运行器
`MockitoJUnitRunner`
或规则
`MockitoRule`
。 我们还可以在
`@Before`
带注解的 Junit 方法中显式调用
`initMock
()`
方法。
```
java
//1
```
java
@RunWith
(
MockitoJUnitRunner
.
class
)
public
class
ApplicationTest
{
//code
...
...
@@ -97,24 +97,25 @@ public class ApplicationTest {
```
//2
```
java
//2
public
class
ApplicationTest
{
@Rule
public
MockitoRule
rule
=
MockitoJUnit
.
rule
().
strictness
(
Strictness
.
STRICT_S
TUBS
);
@Rule
public
MockitoRule
rule
=
MockitoJUnit
.
rule
().
strictness
(
Strictness
.
STRICT_S
tub
);
//code
}
```
```
java
//3
```
java
public
class
ApplicationTest
{
@Before
public
void
init
()
{
MockitoAnnotations
.
initMock
s
(
this
);
MockitoAnnotations
.
initMock
(
this
);
}
}
...
...
@@ -170,7 +171,7 @@ public class RecordService
请记住,如果我们使用诸如 Spring 之类的任何 DI 框架,那么我们可能已经使用了注解
`@Autowired`
。
要测试这个
RecordService
类,让我们创建一个单元测试。
要测试这个
`RecordService`
类,让我们创建一个单元测试。
```
java
import
static
org
.
junit
.
Assert
.
assertEquals
;
...
...
@@ -179,7 +180,7 @@ import static org.mockito.Mockito.verify;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.InjectMock
s
;
import
org.mockito.InjectMock
;
import
org.mockito.Mock
;
import
org.mockito.junit.MockitoJUnitRunner
;
...
...
@@ -190,7 +191,7 @@ import com.howtodoinjava.demo.mockito.RecordService;
@RunWith
(
MockitoJUnitRunner
.
class
)
public
class
ApplicationTest
{
@InjectMock
s
@InjectMock
RecordService
recordService
;
@Mock
...
...
@@ -215,10 +216,10 @@ public class ApplicationTest
让我们逐步了解以上测试类:
*
用
`@RunWith(MockitoJUnitRunner.class)`
注解测试,以便 Mockito 可以处理注解。
*
使用
@Mock 注解对 dao 字段进行注解,以为它们两个实例化一个 Mocks
对象。
*
使用
@InjectMocks
注解对服务字段进行注解,以首先实例化然后注入两个模拟的依赖项。
*
在要测试的类上调用方法进行测试,即
。
*recordService*
。
*
验证 Mock
s
对象中的方法已被调用。
*
使用
`@Mock`
注解对 dao 字段进行注解,以为它们两个实例化一个 Mock
对象。
*
使用
`@InjectMock`
注解对服务字段进行注解,以首先实例化然后注入两个模拟的依赖项。
*
在要测试的类上调用方法进行测试,即
`recordService`
。
*
验证 Mock 对象中的方法已被调用。
还有许多其他方法可以测试方法和模拟的依赖项,我们将在以后的文章中介绍。
...
...
docs/misc/208.md
浏览文件 @
c400f7bf
# Mockito 注解–
@ Mock,@ Spy,@ Captor,@ InjectMocks
# Mockito 注解–
`@Mock`,`@Spy`,`@Captor`,`@InjectMock`
> 原文: [https://howtodoinjava.com/mockito/mockito-annotations/](https://howtodoinjava.com/mockito/mockito-annotations/)
在此 Mockito 教程中,了解
**Mockito 注解**
,例如
**@Mock**
,
**@Spy**
,
**@Captor**
,
**@InjectMocks [**
。 学习使用模仿注解为行为测试编写单元测试。
在此 Mockito 教程中,了解
**Mockito 注解**
,例如
`@Mock`
,
`@Spy`
,
`@Captor`
,
`@InjectMock`
。 学习使用模仿注解为行为测试编写单元测试。
## 1\. Mockito 注解
#### 1.1
@嘲笑
#### 1.1
`@Mock`
**@Mock**
注解用于创建和注入模拟实例。 我们不创建真实的对象,而是要求嘲笑为类创建一个嘲笑
。
`@Mock`
注解用于创建和注入模拟实例。 我们不创建真实的对象,而是要求 Mock 为类创建一个 Mock
。
`@Mock`
注解是
`Mockito.mock(classToMock)`
的替代方法。 它们都达到相同的结果。 通常认为使用
`@Mock`
是“
**清洁剂
**
”,因为我们没有用看起来都一样的样板分配填充测试。
`@Mock`
注解是
`Mockito.mock(classToMock)`
的替代方法。 它们都达到相同的结果。 通常认为使用
`@Mock`
是“
**清洁器
**
”,因为我们没有用看起来都一样的样板分配填充测试。
使用
`@Mock`
注解:
*
允许快速创建测试所需的对象。
*
最小化重复的模拟创建代码。
*
使测试类更具可读性。
*
由于使用
`field name`
来识别模拟,因此使验证错误更易于阅读。
*
由于使用
字段名称
来识别模拟,因此使验证错误更易于阅读。
在给定的示例中,我们模拟了
`HashMap`
类。 在实际测试中,我们将模拟实际的应用类。 我们在映射中放置了一个键值对,然后验证了对模拟映射实例执行了方法调用。
...
...
@@ -38,9 +38,9 @@ public void saveTest()
```
#### 1.2
@Spies
#### 1.2
`@Spy`
**@Spy**
注解用于
**创建真实对象并监视该真实对象**
。 Spies
程序可以帮助调用对象的所有常规方法,同时仍可以跟踪每次交互,就像使用模拟一样。
`@Spy`
注解用于
**创建真实对象并监视该真实对象**
。 Spy
程序可以帮助调用对象的所有常规方法,同时仍可以跟踪每次交互,就像使用模拟一样。
请注意,在给定的示例中,由于我们向其中添加了一个键值对,因此映射的大小如何保持为 1。 我们还可以使用它的键取回添加到映射的值。 在模拟实例中是不可能的。
...
...
@@ -97,13 +97,13 @@ public void saveTest()
```
#### 1.4 @InjectMock
s
#### 1.4 @InjectMock
在
嘲笑中,我们需要创建要测试的类的对象,然后插入其依赖项(
*模拟*
)以完全测试行为。 为此,我们使用
**@InjectMocks
**
注解。
在
Mock中,我们需要创建要测试的类的对象,然后插入其依赖项(
*模拟*
)以完全测试行为。 为此,我们使用
**@InjectMock
**
注解。
@InjectMock
s
标记应在其上执行注射的字段。 Mockito 将尝试仅通过构造器注入,setter 注入或属性注入按此顺序注入模拟。 如果任何给定的注射策略失败,则 Mockito 不会报告失败。
@InjectMock 标记应在其上执行注射的字段。 Mockito 将尝试仅通过构造器注入,setter 注入或属性注入按此顺序注入模拟。 如果任何给定的注射策略失败,则 Mockito 不会报告失败。
> 阅读更多: [@Mock 和@InitMock
s 注解之间的区别](https://howtodoinjava.com/mockito/mockito-mock-initmocks
/)
> 阅读更多: [@Mock 和@InitMock
注解之间的区别](https://howtodoinjava.com/mockito/mockito-mock-initMock
/)
## 2\. 如何初始化 Mockito 注解
...
...
@@ -126,7 +126,7 @@ public void saveTest()
```
2.
在单元测试类的
**@Before**
方法中使用
`MockitoAnnotations.initMock
s
(this)`
。
2.
在单元测试类的
**@Before**
方法中使用
`MockitoAnnotations.initMock(this)`
。
```java
public class ExampleTest {
...
...
@@ -136,7 +136,7 @@ public void saveTest()
@Before
public void setup() {
MockitoAnnotations.initMock
s
(this);
MockitoAnnotations.initMock(this);
}
@Test
...
...
@@ -173,6 +173,6 @@ public void saveTest()
参考文献:
[
模拟 Java Doc
](
https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/Mock.html
)
[
Sp
ies
Java Doc
](
https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/Spy.html
)
[
Sp
y
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
[
InjectMock Java Doc
](
https://static.javadoc.io/org.mockito/mockito-core/2.23.4/org/mockito/InjectMock.html
)
\ No newline at end of file
docs/misc/209.md
浏览文件 @
c400f7bf
# Mockito – @Mock 和@InjectMock
s
注解之间的区别
# Mockito – @Mock 和@InjectMock 注解之间的区别
> 原文: [https://howtodoinjava.com/mockito/mockito-mock-inject
mocks/](https://howtodoinjava.com/mockito/mockito-mock-injectmocks
/)
> 原文: [https://howtodoinjava.com/mockito/mockito-mock-inject
Mock/](https://howtodoinjava.com/mockito/mockito-mock-injectMock
/)
在使用
[
junit
](
https://howtodoinjava.com/junit-4/
)
和 Mockito 进行
[
单元测试
](
https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/
)
的过程中,我们使用
**@Mock**
和
**@InjectMocks**
注解来创建要测试的对象和依赖项。 了解 mockito 中@Mock 和@InjectMocks
注解之间的
*区别。*
在使用
[
junit
](
https://howtodoinjava.com/junit-4/
)
和 Mockito 进行
[
单元测试
](
https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/
)
的过程中,我们使用
`@Mock`
和
`@InjectMock`
注解来创建要测试的对象和依赖项。 了解 mockito 中@Mock 和@InjectMock
注解之间的
*区别。*
## 1\. Mock
s 对象与 Stubs
对象之间的区别
## 1\. Mock
对象与 Stub
对象之间的区别
重要的是要了解 Mock
s
对象与
[
对象
](
https://howtodoinjava.com/java/basics/how-to-create-a-class-in-java/
)
之间的区别。 对象是类的实际实例,使用对象引用调用的任何方法都将执行类文件中定义的方法主体。
重要的是要了解 Mock 对象与
[
对象
](
https://howtodoinjava.com/java/basics/how-to-create-a-class-in-java/
)
之间的区别。 对象是类的实际实例,使用对象引用调用的任何方法都将执行类文件中定义的方法主体。
Mock
s
对象是用于隐藏无法在测试环境中测试的依赖项的接口。 数据库,网络位置等。使用模拟引用调用的方法不会执行类文件中定义的方法主体,而是使用
**when-thenReturn**
方法组合来配置方法行为。
Mock 对象是用于隐藏无法在测试环境中测试的依赖项的接口。 数据库,网络位置等。使用模拟引用调用的方法不会执行类文件中定义的方法主体,而是使用
**when-thenReturn**
方法组合来配置方法行为。
在 junit 测试中,我们为需要测试的类和要调用的方法创建对象。 我们为依赖项创建了模拟,这些依赖项不会出现在测试环境中,并且对象依赖于该依赖项来完成方法调用。
## 2\. @Mock 和@InjectMock
s
之间的区别
## 2\. @Mock 和@InjectMock 之间的区别
在基于 Mockito 的 junit 测试中,
**@Mock 注解创建模拟,而@InjectMock
s
创建类对象**
。
在基于 Mockito 的 junit 测试中,
**@Mock 注解创建模拟,而@InjectMock 创建类对象**
。
> @Mock –创建模拟
> @InjectMock
s
–创建对象并注入模拟的依赖项
> @InjectMock –创建对象并注入模拟的依赖项
*
使用@InjectMock
s
创建需要在测试类中进行测试的类实例。
*
当需要为给定类执行实际方法主体时,请使用@InjectMock
s
。
*
当我们需要使用 Mock
s 对象初始化的所有内部依赖项以正常工作方法时,请使用@InjectMocks
。
*
使用@InjectMock 创建需要在测试类中进行测试的类实例。
*
当需要为给定类执行实际方法主体时,请使用@InjectMock。
*
当我们需要使用 Mock
对象初始化的所有内部依赖项以正常工作方法时,请使用@InjectMock
。
*
使用@Mock 创建模拟,以支持要测试的类的测试。
*
带有@Mock 注解的带注解的类(待测试)依赖项。
*
我们必须为 Mock
s
对象定义 when-thenRetrun 方法,在实际测试执行期间将调用哪些类方法。
*
我们必须为 Mock 对象定义 when-thenRetrun 方法,在实际测试执行期间将调用哪些类方法。
## 3\. @Mock 和@InjectMock
s
示例
## 3\. @Mock 和@InjectMock 示例
让我们通过示例来了解@Mock 和@InjectMock
s
之间的区别。 在此示例中,我们具有类
`MainClass`
,其类具有方法
**save()**
。
让我们通过示例来了解@Mock 和@InjectMock 之间的区别。 在此示例中,我们具有类
`MainClass`
,其类具有方法
**save()**
。
`MainClass`
依赖于
`DatabaseDAO`
和
`NetworkDAO`
。 当我们调用
`MainClass.save()`
方法时,它在内部调用两个相关对象的保存方法。
...
...
@@ -83,13 +83,13 @@ import static org.junit.Assert.assertEquals;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.mockito.InjectMock
s
;
import
org.mockito.InjectMock
;
import
org.mockito.Mock
;
import
org.mockito.MockitoAnnotations
;
public
class
ApplicationTest
{
@InjectMock
s
@InjectMock
MainClass
mainClass
;
@Mock
...
...
@@ -100,7 +100,7 @@ public class ApplicationTest
@Before
public
void
init
()
{
MockitoAnnotations
.
initMock
s
(
this
);
MockitoAnnotations
.
initMock
(
this
);
}
@Test
...
...
@@ -121,11 +121,11 @@ Saved in network in Main class
```
在上面的测试中,将打印用 MainClass.save()方法编写的语句,但不打印从属类。 它证明了方法主体仅针对 MainClass 的 save()方法执行,因为我们使用
`@InjectMock
s
`
注解创建了 MainClass 的实际对象。 对于依赖类,我们使用了模拟。
在上面的测试中,将打印用 MainClass.save()方法编写的语句,但不打印从属类。 它证明了方法主体仅针对 MainClass 的 save()方法执行,因为我们使用
`@InjectMock`
注解创建了 MainClass 的实际对象。 对于依赖类,我们使用了模拟。
#### 3.3 验证模拟的方法调用
要验证是否已调用模拟方法,我们必须使用
嘲笑
提供的实用程序方法
**verify()**
。 它有助于验证在执行实际的测试类方法时是否已执行了模拟方法。
要验证是否已调用模拟方法,我们必须使用
Mock
提供的实用程序方法
**verify()**
。 它有助于验证在执行实际的测试类方法时是否已执行了模拟方法。
```
java
@Test
...
...
@@ -142,7 +142,7 @@ public void validateTest()
## 4 结论
在此 mockito 教程中,我们了解了@Mock 和@InjectMock
s
注解之间的
*区别。 我们了解了在 junit 测试中将这些注解应用于类时发生了什么。*
在此 mockito 教程中,我们了解了@Mock 和@InjectMock 注解之间的
*区别。 我们了解了在 junit 测试中将这些注解应用于类时发生了什么。*
学习愉快!
...
...
docs/misc/211.md
浏览文件 @
c400f7bf
...
...
@@ -48,13 +48,13 @@
#### 2.1 MockitoJUnitRunner 类
**MockitoJUnitRunner**
类自动初始化所有带有
`@Mock`
和
`@InjectMock
s
`
注解的对象。
**MockitoJUnitRunner**
类自动初始化所有带有
`@Mock`
和
`@InjectMock`
注解的对象。
```
java
@RunWith
(
MockitoJUnitRunner
.
class
)
public
class
TestEmployeeManager
{
@InjectMock
s
@InjectMock
EmployeeManager
manager
;
@Mock
...
...
@@ -65,14 +65,14 @@ public class TestEmployeeManager {
```
#### 2.2 MockitoAnnotations.initMock
s
()方法
#### 2.2 MockitoAnnotations.initMock()方法
如果我们不使用 MockitoJUnitRunner 类方法,则可以使用静态方法
`MockitoAnnotations.initMock
s()`
。 在初始化 junit 测试时,该方法还会初始化 Mocks
对象。
如果我们不使用 MockitoJUnitRunner 类方法,则可以使用静态方法
`MockitoAnnotations.initMock
()`
。 在初始化 junit 测试时,该方法还会初始化 Mock
对象。
```
java
public
class
TestEmployeeManager
{
@InjectMock
s
@InjectMock
EmployeeManager
manager
;
@Mock
...
...
@@ -80,7 +80,7 @@ public class TestEmployeeManager {
@Before
public
void
init
()
{
MockitoAnnotations
.
initMock
s
(
this
);
MockitoAnnotations
.
initMock
(
this
);
}
//tests
...
...
@@ -88,16 +88,16 @@ public class TestEmployeeManager {
```
#### 2.3 @模拟 vs @InjectMock
s
#### 2.3 @模拟 vs @InjectMock
*
**@Mock**
注解会为其注解的类创建一个模拟实现。
*
**@InjectMock
s
**
还将创建模拟实现,另外将标有注解
`@Mock`
的从属模拟注入其中。
*
**@InjectMock**
还将创建模拟实现,另外将标有注解
`@Mock`
的从属模拟注入其中。
在上面的示例中,我们用
`@InjectMock
s
`
注解了
`EmployeeManager`
类,因此模仿者将为
`EmployeeManager`
类创建模仿对象,并将
`EmployeeDao`
的模仿依赖项注入其中。
在上面的示例中,我们用
`@InjectMock`
注解了
`EmployeeManager`
类,因此模仿者将为
`EmployeeManager`
类创建模仿对象,并将
`EmployeeDao`
的模仿依赖项注入其中。
## 3\. 使用 Mockito 进行 JUnit 测试
让我们看几个例子,这些例子编写了 junit 测试,以使用通过嘲讽创建的 Mock
s
对象对服务层方法进行单元测试。
让我们看几个例子,这些例子编写了 junit 测试,以使用通过嘲讽创建的 Mock 对象对服务层方法进行单元测试。
很少有示例方法是
`getAllEmployees()`
,该方法将返回
`EmployeeVO`
对象的列表,
`getEmployeeById(int id)`
以给定 id 返回雇员。 和
`createEmployee()`
将添加一个雇员对象并返回
`void`
。
...
...
@@ -117,7 +117,7 @@ import java.util.List;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.mockito.InjectMock
s
;
import
org.mockito.InjectMock
;
import
org.mockito.Mock
;
import
org.mockito.MockitoAnnotations
;
import
org.mockito.junit.MockitoJUnitRunner
;
...
...
@@ -128,7 +128,7 @@ import com.howtodoinjava.demo.service.EmployeeManager;
public
class
TestEmployeeManager
{
@InjectMock
s
@InjectMock
EmployeeManager
manager
;
@Mock
...
...
@@ -136,7 +136,7 @@ public class TestEmployeeManager {
@Before
public
void
init
()
{
MockitoAnnotations
.
initMock
s
(
this
);
MockitoAnnotations
.
initMock
(
this
);
}
@Test
...
...
@@ -277,6 +277,6 @@ public class EmployeeDao {
在此
**mockito 教程**
中,我们学习了使用 JUnit 和 Mockito 对 Spring Boot 应用中的服务层进行单元测试。 我们学习了如何设置测试类并编写 JUnit 测试。
我们还了解了@Mock 和@InjectMock
s
注解之间的
**区别。**
我们还了解了@Mock 和@InjectMock 注解之间的
**区别。**
学习愉快!
\ No newline at end of file
docs/misc/213.md
浏览文件 @
c400f7bf
...
...
@@ -138,7 +138,7 @@ public void firstMockTest()
```
以上测试将成功执行。 在此,当调用
`employeeController.getProjectedEmployeeCount()`
时,它依次从 Mock
s
对象中调用方法
`getEmployeeCount()`
,该方法返回值 8。控制器将其乘以 2,返回值为 16。该返回值等于 assert 语句中的期望值, 因此测试通过了。
以上测试将成功执行。 在此,当调用
`employeeController.getProjectedEmployeeCount()`
时,它依次从 Mock 对象中调用方法
`getEmployeeCount()`
,该方法返回值 8。控制器将其乘以 2,返回值为 16。该返回值等于 assert 语句中的期望值, 因此测试通过了。
## 验证是否真的调用了模拟方法?
...
...
@@ -188,11 +188,11 @@ Actually, there were zero interactions with this mock.
## 使用模拟设置获取有关测试运行的更多信息
这些模拟设置很少使用,但在某些情况下很有用。 如果您想为模拟命名,以供将来调试之用,请使用它们。 或者您想启用详细日志记录以获取更多信息。 当您要注册一个监听器来通知该模拟方法的调用时,可以使用它。 甚至在尚未实现实际对象的 Mock
s
对象上实现一些额外的接口。
这些模拟设置很少使用,但在某些情况下很有用。 如果您想为模拟命名,以供将来调试之用,请使用它们。 或者您想启用详细日志记录以获取更多信息。 当您要注册一个监听器来通知该模拟方法的调用时,可以使用它。 甚至在尚未实现实际对象的 Mock 对象上实现一些额外的接口。
```
java
@Test
public
void
mockS
ettingsTest
()
{
public
void
Mock
ettingsTest
()
{
EmployeeService
mock
=
PowerMockito
.
mock
(
EmployeeService
.
class
,
Mockito
.
withSettings
()
.
name
(
"EmployeeServiceMock"
)
...
...
@@ -224,7 +224,7 @@ employeeService.saveEmployee(
employeeService
.
saveEmployee
(
com
.
howtodoinjava
.
powermock
.
examples
.
model
.
Employee
@c9131c
);
invoked:
->
at
com
.
howtodoinjava
.
powermock
.
examples
.
test
.
EmployeeControllerTestOne
.
mockS
ettingsTest
(
EmployeeControllerTestOne
.
java
:
64
)
invoked:
->
at
com
.
howtodoinjava
.
powermock
.
examples
.
test
.
EmployeeControllerTestOne
.
Mock
ettingsTest
(
EmployeeControllerTestOne
.
java
:
64
)
has
returned:
"null"
```
...
...
docs/misc/267.md
浏览文件 @
c400f7bf
...
...
@@ -13,7 +13,7 @@ Table of Contents
4
\
.
Jasmine
Describe
Blocks
5
\
.
Jasmine
Matchers
6
\
.
Disable
Suites
and
Specs
7
\
.
Working
with
Jasmine
Sp
ies
7
\
.
Working
with
Jasmine
Sp
y
8
\
.
Final
Thoughts
```
...
...
@@ -337,11 +337,11 @@ describe("MathUtils", function() {
```
## 7\. 与茉莉花 Sp
ies
一起工作
## 7\. 与茉莉花 Sp
y
一起工作
茉莉具有双重测试功能,称为 Sp
ies。 Spies 可以对任何函数进行 Stubs,并跟踪对该函数和所有参数的调用。 Spies 仅存在于定义它的
`describe`
或
`it`
块中,并且在每个规范后都会被删除。 要使用任何方法创建 Spies
,请使用
`spyOn(object, 'methodName')`
调用。
茉莉具有双重测试功能,称为 Sp
y。 Spy 可以对任何函数进行 Stub,并跟踪对该函数和所有参数的调用。 Spy 仅存在于定义它的
`describe`
或
`it`
块中,并且在每个规范后都会被删除。 要使用任何方法创建 Spy
,请使用
`spyOn(object, 'methodName')`
调用。
有两个匹配器
`toHaveBeenCalled`
和
`toHaveBeenCalledWith`
应该与 Sp
ies 一起使用。 如果调用了 Spies,则
`toHaveBeenCalled`
匹配器将返回 true;否则,将返回 true。 如果参数列表与对 Spies
的任何记录调用匹配,则
`toHaveBeenCalledWith`
匹配器将返回 true。
有两个匹配器
`toHaveBeenCalled`
和
`toHaveBeenCalledWith`
应该与 Sp
y 一起使用。 如果调用了 Spy,则
`toHaveBeenCalled`
匹配器将返回 true;否则,将返回 true。 如果参数列表与对 Spy
的任何记录调用匹配,则
`toHaveBeenCalledWith`
匹配器将返回 true。
```
java
describe
(
"MathUtils"
,
function
()
{
...
...
@@ -369,9 +369,9 @@ describe("MathUtils", function() {
```
上面的示例本质上是最基本的,您也可以使用 Sp
ies 来验证对内部方法的调用。 例如。 如果在任何对象上调用方法
`calculateInterest()`
,则可能需要检查是否必须在该对象内调用
`getPrincipal()`
,
`getROI()`
和
`getTime()`
。 Spies
将帮助您验证这些假设。
上面的示例本质上是最基本的,您也可以使用 Sp
y 来验证对内部方法的调用。 例如。 如果在任何对象上调用方法
`calculateInterest()`
,则可能需要检查是否必须在该对象内调用
`getPrincipal()`
,
`getROI()`
和
`getTime()`
。 Spy
将帮助您验证这些假设。
当没有要监视的功能时,
`jasmine.createSpy`
可以创建裸露的 Sp
ies。 该 Spies 的行为与其他任何 Spies 一样-跟踪调用,参数等。但是它背后没有实现。 Spies 是 JavaScript 对象,可以这样使用。 通常,这些 Spies
在需要时用作其他函数的回调函数。
当没有要监视的功能时,
`jasmine.createSpy`
可以创建裸露的 Sp
y。 该 Spy 的行为与其他任何 Spy 一样-跟踪调用,参数等。但是它背后没有实现。 Spy 是 JavaScript 对象,可以这样使用。 通常,这些 Spy
在需要时用作其他函数的回调函数。
```
java
var
callback
=
jasmine
.
createSpy
(
'
callback
'
);
...
...
@@ -392,17 +392,17 @@ tape.play();
```
在
`calls`
属性上跟踪并公开了对 Sp
ies 的每次调用。 让我们看看如何使用这些属性来跟踪 Spies
。
在
`calls`
属性上跟踪并公开了对 Sp
y 的每次调用。 让我们看看如何使用这些属性来跟踪 Spy
。
| 追踪属性 | Purpose |
| .calls.any() | 如果根本没有调用过该 Sp
ies
,则返回 false;如果至少发生一次调用,则返回 true。 |
| .calls.count() | 返回 Sp
ies
被调用的次数 |
| .calls.any() | 如果根本没有调用过该 Sp
y
,则返回 false;如果至少发生一次调用,则返回 true。 |
| .calls.count() | 返回 Sp
y
被调用的次数 |
| .calls.argsFor(index) | 返回传递给电话号码索引的参数 |
| .calls.allArgs() | 返回所有调用的参数 |
| .calls.all() | 返回上下文(
`this`
),并且参数传递了所有调用 |
| .calls.mostRecent() | 返回上下文(
`this`
)和最近一次调用的参数 |
| .calls.first() | 返回第一次调用的上下文(
`this`
)和参数 |
| .calls.reset() | 清除所有跟踪以发现 Sp
ies
|
| .calls.reset() | 清除所有跟踪以发现 Sp
y
|
## 8\. 茉莉花教程–最终想法
...
...
docs/misc/273.md
浏览文件 @
c400f7bf
...
...
@@ -24,7 +24,7 @@ Android app project structure
## 2)Java 源代码
创建项目时(例如,通过 android create project),您为应用(例如
`com.howtodoinjava.DemoApp`
)提供了“
**main**
”活动的全限定类名。 然后,您会发现项目的 src /树已经安装了包的目录树,还有代表您的主要活动的 Stub
s
Activity 子类(例如
**`src/com/howtodoinjava/DemoAppMainActivity.java`**
)。 欢迎您修改此文件,并根据需要将其他文件添加到 src /树中,以实现您的应用。
创建项目时(例如,通过 android create project),您为应用(例如
`com.howtodoinjava.DemoApp`
)提供了“
**main**
”活动的全限定类名。 然后,您会发现项目的 src /树已经安装了包的目录树,还有代表您的主要活动的 Stub 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录