Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
apachecn-java-zh
提交
0cd54010
A
apachecn-java-zh
项目概览
OpenDocCN
/
apachecn-java-zh
9 个月 前同步成功
通知
5
Star
53
Fork
13
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-java-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0cd54010
编写于
10月 01, 2021
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2021-10-01 18:03:47
上级
f457f993
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
66 addition
and
60 deletion
+66
-60
docs/master-soft-test-junit5/5.md
docs/master-soft-test-junit5/5.md
+66
-60
未找到文件。
docs/master-soft-test-junit5/5.md
浏览文件 @
0cd54010
...
...
@@ -82,7 +82,7 @@ MyDoc docMock;
替代方法是使用
`Mockito.mock`
方法,如下所示:
```
java
MyDoc
docMock
=
Mockito
.
*
mock
*
(
MyDoc
.
class
)
MyDoc
docMock
=
Mockito
.
mock
(
MyDoc
.
class
)
```
以下各节包含使用上表中描述的 Jupiter 测试中的 Mockito API 的综合示例。
...
...
@@ -92,7 +92,7 @@ MyDoc docMock = Mockito.*mock*(MyDoc.class)
在撰写本文时,还没有官方的 JUnit5 扩展在 Jupiter 测试中使用 Mockito。然而,JUnit5 团队提供了一个简单的现成 Java 类,实现了一个简单但有效的 Mockito 扩展。该类可以在
[
JUnit5 用户指南
](
http://junit.org/junit5/docs/current/user-guide/
)
中找到,其代码如下:
```
java
import
static
org
.
mockito
.
Mockito
.
*
mock
*
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
java.lang.reflect.Parameter
;
import
org.junit.jupiter.api.extension.ExtensionContext
;
...
...
@@ -134,10 +134,10 @@ public class MockitoExtension
String
mockName
=
getMockName
(
parameter
);
if
(
mockName
!=
null
)
{
return
mocks
.
getOrComputeIfAbsent
(
mockName
,
key
->
*
mock
*
(
mockType
,
mockName
));
key
->
mock
(
mockType
,
mockName
));
}
else
{
return
mocks
.
getOrComputeIfAbsent
(
mockType
.
getCanonicalName
(),
key
->
*
mock
*
(
mockType
));
key
->
mock
(
mockType
));
}
}
...
...
@@ -344,10 +344,10 @@ public class LoginRepository {
package
io.github.bonigarcia
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
mockito
.
Mockito
.
*
verify
*
;
import
static
org
.
mockito
.
Mockito
.
*
verifyNoMoreInteractions
*
;
import
static
org
.
mockito
.
Mockito
.
*
verifyZeroInteractions
*
;
import
static
org
.
mockito
.
Mockito
.
*
when
*
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
static
org
.
mockito
.
Mockito
.
verifyNoMoreInteractions
;
import
static
org
.
mockito
.
Mockito
.
verifyZeroInteractions
;
import
static
org
.
mockito
.
Mockito
.
when
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
...
...
@@ -371,29 +371,29 @@ class LoginControllerLoginTest {
@Test
void
testLoginOk
()
{
// Setting expectations (stubbing methods)
*
when
*
(
loginService
.
login
(
userForm
)).
thenReturn
(
true
);
when
(
loginService
.
login
(
userForm
)).
thenReturn
(
true
);
// Exercise SUT
String
reseponseLogin
=
loginController
.
login
(
userForm
);
// Verification
assertEquals
(
"OK"
,
reseponseLogin
);
*
verify
*
(
loginService
).
login
(
userForm
);
*
verifyNoMoreInteractions
*
(
loginService
);
verify
(
loginService
).
login
(
userForm
);
verifyNoMoreInteractions
(
loginService
);
}
@Test
void
testLoginKo
()
{
// Setting expectations (stubbing methods)
*
when
*
(
loginService
.
login
(
userForm
)).
thenReturn
(
false
);
when
(
loginService
.
login
(
userForm
)).
thenReturn
(
false
);
// Exercise SUT
String
reseponseLogin
=
loginController
.
login
(
userForm
);
// Verification
assertEquals
(
"KO"
,
reseponseLogin
);
*
verify
*
(
loginService
).
login
(
userForm
);
*
verifyZeroInteractions
*
(
loginService
);
verify
(
loginService
).
login
(
userForm
);
verifyZeroInteractions
(
loginService
);
}
}
...
...
@@ -413,8 +413,8 @@ class LoginControllerLoginTest {
package
io.github.bonigarcia
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
mockito
.
ArgumentMatchers
.
*
any
*
;
import
static
org
.
mockito
.
Mockito
.
*
when
*
;
import
static
org
.
mockito
.
ArgumentMatchers
.
any
;
import
static
org
.
mockito
.
Mockito
.
when
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
...
...
@@ -445,7 +445,7 @@ class LoginControllerErrorTest {
@Test
void
testLoginException
()
{
// Expectation
*
when
*(
loginService
.
login
(*
any
*
(
UserForm
.
class
)))
when
(
loginService
.
login
(
any
(
UserForm
.
class
)))
.
thenThrow
(
IllegalArgumentException
.
class
);
// Exercise
...
...
@@ -470,8 +470,8 @@ class LoginControllerErrorTest {
package
io.github.bonigarcia
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
mockito
.
ArgumentMatchers
.
*
any
*
;
import
static
org
.
mockito
.
BDDMockito
.
*
given
*
;
import
static
org
.
mockito
.
ArgumentMatchers
.
any
;
import
static
org
.
mockito
.
BDDMockito
.
given
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
...
...
@@ -492,13 +492,13 @@ class LoginControllerBDDTest {
@Test
void
testLoginOk
()
{
*
given
*
(
loginService
.
login
(
userForm
)).
willReturn
(
true
);
given
(
loginService
.
login
(
userForm
)).
willReturn
(
true
);
assertEquals
(
"OK"
,
loginController
.
login
(
userForm
));
}
@Test
void
testLoginKo
()
{
*
given
*
(
loginService
.
login
(
userForm
)).
willReturn
(
false
);
given
(
loginService
.
login
(
userForm
)).
willReturn
(
false
);
assertEquals
(
"KO"
,
loginController
.
login
(
userForm
));
}
...
...
@@ -509,7 +509,7 @@ class LoginControllerBDDTest {
@Test
void
testLoginException
()
{
*
given
*(
loginService
.
login
(*
any
*
(
UserForm
.
class
)))
given
(
loginService
.
login
(
any
(
UserForm
.
class
)))
.
willThrow
(
IllegalArgumentException
.
class
);
assertEquals
(
"ERROR"
,
loginController
.
login
(
userForm
));
}
...
...
@@ -531,11 +531,11 @@ package io.github.bonigarcia;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertFalse
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertThrows
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertTrue
;
import
static
org
.
mockito
.
ArgumentMatchers
.
*
any
*
;
import
static
org
.
mockito
.
Mockito
.
*
atLeast
*
;
import
static
org
.
mockito
.
Mockito
.
*
times
*
;
import
static
org
.
mockito
.
Mockito
.
*
verify
*
;
import
static
org
.
mockito
.
Mockito
.
*
when
*
;
import
static
org
.
mockito
.
ArgumentMatchers
.
any
;
import
static
org
.
mockito
.
Mockito
.
atLeast
;
import
static
org
.
mockito
.
Mockito
.
times
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
static
org
.
mockito
.
Mockito
.
when
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
...
...
@@ -556,21 +556,21 @@ class LoginServiceTest {
@Test
void
testLoginOk
()
{
*
when
*(
loginRepository
.
login
(*
any
*
(
UserForm
.
class
))).
thenReturn
(
true
);
when
(
loginRepository
.
login
(
any
(
UserForm
.
class
))).
thenReturn
(
true
);
assertTrue
(
loginService
.
login
(
userForm
));
*
verify
*(
loginRepository
,
*
atLeast
*
(
1
)).
login
(
userForm
);
verify
(
loginRepository
,
atLeast
(
1
)).
login
(
userForm
);
}
@Test
void
testLoginKo
()
{
*
when
*(
loginRepository
.
login
(*
any
*
(
UserForm
.
class
))).
thenReturn
(
false
);
when
(
loginRepository
.
login
(
any
(
UserForm
.
class
))).
thenReturn
(
false
);
assertFalse
(
loginService
.
login
(
userForm
));
*
verify
*(
loginRepository
,
*
times
*
(
1
)).
login
(
userForm
);
verify
(
loginRepository
,
times
(
1
)).
login
(
userForm
);
}
@Test
void
testLoginTwice
()
{
*
when
*
(
loginRepository
.
login
(
userForm
)).
thenReturn
(
true
);
when
(
loginRepository
.
login
(
userForm
)).
thenReturn
(
true
);
assertThrows
(
LoginException
.
class
,
()
->
{
loginService
.
login
(
userForm
);
loginService
.
login
(
userForm
);
...
...
@@ -592,7 +592,7 @@ class LoginServiceTest {
package
io.github.bonigarcia
;
import
static
org
.
junit
.
jupiter
.
api
.
Assertions
.
assertEquals
;
import
static
org
.
mockito
.
Mockito
.
*
verify
*
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
...
...
@@ -619,7 +619,7 @@ class LoginServiceChaptorTest {
@Test
void
testArgumentCaptor
()
{
loginService
.
login
(
userForm
);
*
verify
*
(
loginRepository
).
login
(
argCaptor
.
capture
());
verify
(
loginRepository
).
login
(
argCaptor
.
capture
());
assertEquals
(
userForm
,
argCaptor
.
getValue
());
}
...
...
@@ -1111,7 +1111,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public
class
MySpringBootApplication
{
final
Logger
log
=
LoggerFactory
.
*
getLogger
*
(
MySpringBootApplication
.
class
);
final
Logger
log
=
LoggerFactory
.
getLogger
(
MySpringBootApplication
.
class
);
@Autowired
public
MessageComponent
messageComponent
;
...
...
@@ -1170,7 +1170,7 @@ class SimpleSpringBootTest {
```
java
package
io.github.bonigarcia
;
import
static
org
.
springframework
.
web
.
bind
.
annotation
.
RequestMethod
.
*
GET
*
;
import
static
org
.
springframework
.
web
.
bind
.
annotation
.
RequestMethod
.
GET
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
...
...
@@ -1182,7 +1182,7 @@ public class WebController {
@Autowired
private
PageService
pageService
;
@RequestMapping
(
value
=
"/"
,
method
=
*
GET
*
)
@RequestMapping
(
value
=
"/"
,
method
=
GET
)
public
String
greeting
()
{
return
pageService
.
getPage
();
}
...
...
@@ -1220,10 +1220,10 @@ public class PageService {
```
java
package
io.github.bonigarcia
;
import
static
org
.
hamcrest
.
core
.
StringContains
.
*
containsString
*
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
request
.
MockMvcRequestBuilders
.
*
get
*
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
*
content
*
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
*
status
*
;
import
static
org
.
hamcrest
.
core
.
StringContains
.
containsString
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
request
.
MockMvcRequestBuilders
.
get
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
content
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
status
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
...
...
@@ -1243,9 +1243,9 @@ class IndexTest {
@Test
void
testIndex
()
throws
Exception
{
mockMvc
.
perform
(
*
get
*(
"/index.html"
)).
andExpect
(*
status
*
().
isOk
())
.
andExpect
(
*
content
*
().
contentType
(
"text/html"
)).
andExpect
(
*
content
*().
string
(*
containsString
*
(
"This is index
mockMvc
.
perform
(
get
(
"/index.html"
)).
andExpect
(
status
().
isOk
())
.
andExpect
(
content
().
contentType
(
"text/html"
)).
andExpect
(
content
().
string
(
containsString
(
"This is index
page"
)));
}
...
...
@@ -1263,10 +1263,10 @@ class IndexTest {
```
java
package
io.github.bonigarcia
;
import
static
org
.
mockito
.
Mockito
.
*
doReturn
*
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
request
.
MockMvcRequestBuilders
.
*
get
*
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
*
redirectedUrl
*
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
*
status
*
;
import
static
org
.
mockito
.
Mockito
.
doReturn
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
request
.
MockMvcRequestBuilders
.
get
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
redirectedUrl
;
import
static
org
.
springframework
.
test
.
web
.
servlet
.
result
.
MockMvcResultMatchers
.
status
;
import
org.junit.jupiter.api.Test
;
import
org.junit.jupiter.api.extension.ExtendWith
;
...
...
@@ -1290,9 +1290,9 @@ class RedirectTest {
@Test
void
test
()
throws
Exception
{
*
doReturn
*
(
"redirect:/page.html"
).
when
(
pageService
).
getPage
();
mockMvc
.
perform
(
*
get
*(
"/"
)).
andExpect
(*
status
*
().
isFound
())
.
andExpect
(
*
redirectedUrl
*
(
"/page.html"
));
doReturn
(
"redirect:/page.html"
).
when
(
pageService
).
getPage
();
mockMvc
.
perform
(
get
(
"/"
)).
andExpect
(
status
().
isFound
())
.
andExpect
(
redirectedUrl
(
"/page.html"
));
}
}
...
...
@@ -1398,7 +1398,13 @@ driver.get("http://junit.org/junit5/");
定位元素:它允许使用不同的策略识别网页(WebElement)中的元素:按 id、名称、类名、CSS 选择器、链接文本、标记名或 XPath
```
java
WebElement
webElement
=
driver
.
findElement
(
By
.*
id
(
"id"
));*
driver
.
findElement
(
By
.*
name
(
"name"
));*
driver
.
findElement
(
By
.*
className
(
"class"
));*
driver
.
findElement
(
By
.*
cssSelector
(
"cssInput"
));*
driver
.
findElement
(
By
.*
linkText
(
"text"
));*
driver
.
findElement
(
By
.*
tagName
(
"tag name"
));*
driver
.
findElement
(
By
.*
xpath
(
"/html/body/div[4]"
));*
WebElement
webElement
=
driver
.
findElement
(
By
.
id
(
"id"
));
driver
.
findElement
(
By
.
name
(
"name"
));
driver
.
findElement
(
By
.
className
(
"class"
));
driver
.
findElement
(
By
.
cssSelector
(
"cssInput"
));
driver
.
findElement
(
By
.
linkText
(
"text"
));
driver
.
findElement
(
By
.
tagName
(
"tag name"
));
driver
.
findElement
(
By
.
xpath
(
"/html/body/div[4]"
));
```
与元素交互:从给定的 WebElement,我们可以执行不同类型的自动交互,例如单击元素、键入文本或清除输入字段、读取属性等。
...
...
@@ -1995,8 +2001,8 @@ dependencies {
```
java
package
io.github.bonigarcia
;
import
static
io
.
restassured
.
RestAssured
.
*
given
*
;
import
static
org
.
hamcrest
.
Matchers
.
*
equalTo
*
;
import
static
io
.
restassured
.
RestAssured
.
given
;
import
static
org
.
hamcrest
.
Matchers
.
equalTo
;
import
org.junit.jupiter.api.Test
;
public
class
PublicRestServicesTest
{
...
...
@@ -2012,10 +2018,10 @@ import org.junit.jupiter.api.Test;
@Test
void
testCountryService
()
{
*
given
*
().
when
()
given
().
when
()
.
get
(
"http://services.groupkt.com/country/get/iso2code/ES"
)
.
then
().
assertThat
().
statusCode
(
200
)
.
body
(
"RestResponse.result.name"
,
*
equalTo
*
(
"Spain"
));
.
body
(
"RestResponse.result.name"
,
equalTo
(
"Spain"
));
}
}
...
...
@@ -2058,20 +2064,20 @@ public class MyRestController {
@Autowired
private
LibraryService
libraryService
;
@RequestMapping
(
value
=
"/books"
,
method
=
RequestMethod
.
*
GET
*
)
@RequestMapping
(
value
=
"/books"
,
method
=
RequestMethod
.
GET
)
public
List
<
Book
>
getBooks
()
{
return
libraryService
.
getBooks
();
}
@RequestMapping
(
value
=
"/book/{index}"
,
method
=
RequestMethod
.
*
GET
*
)
@RequestMapping
(
value
=
"/book/{index}"
,
method
=
RequestMethod
.
GET
)
public
Book
getTeam
(
@PathVariable
(
"index"
)
int
index
)
{
return
libraryService
.
getBook
(
index
);
}
@RequestMapping
(
value
=
"/book"
,
method
=
RequestMethod
.
*
POST
*
)
@RequestMapping
(
value
=
"/book"
,
method
=
RequestMethod
.
POST
)
public
ResponseEntity
<
Boolean
>
addBook
(
@RequestBody
Book
book
)
{
libraryService
.
addBook
(
book
);
return
new
ResponseEntity
<
Boolean
>(
true
,
HttpStatus
.
*
CREATED
*
);
return
new
ResponseEntity
<
Boolean
>(
true
,
HttpStatus
.
CREATED
);
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录