* 创建ArgumentMatcher,根据不同参数值来匹配对应的行为
private
<
T
>
T
createArgumentMatcher
(
final
Predicate
<
T
>
predicate
)
{
return
Mockito
.
argThat
(
new
ArgumentMatcher
<
T
>
(
)
{
@Override
public
boolean
matches
(
Object argument
)
{
if
(
null
==
argument
)
{
return
false
;
return
predicate
.
apply
(
(
T
)
argument
)
;
}
)
;
Predicate<ProductFlowFilter> one = new Predicate<ProductFlowFilter>() {
@Override
public boolean apply(@Nullable ProductFlowFilter filter) {
return "0".equals(filter.getId1());
Predicate<ProductFlowFilter> two = new Predicate<ProductFlowFilter>() {
@Override
public boolean apply(@Nullable ProductFlowFilter filter) {
return "-999999".equals(filter.getId1());
Mockito.when(productFlowDao.getViewFlowData(createArgumentMatcher(one))).thenReturn(json1);
Mockito.when(productFlowDao.getViewFlowData(createArgumentMatcher(two))).thenReturn(json2);
创建对象one和two,根据对象属性的不同值返回不同的mock结果
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@SuppressWarnings("unchecked")
class Different...
整理Mockito结合ArgumentCaptor捕获多次调用的方法的参数
今天在对业务代码进行开发时,发现需要捕获多次调用的方法的参数,验证参数传递的正确性,这里对获取方法进行总结。
首先,模拟一个简单的测试场景,有一个对外提供服务的类:
@Component
public class CaptorLearning {
private DalService dalService;
@Autowired
public CaptorLearning(DalService dal.
1. Mockito简介 调用mock对象的方法时,不会执行真实的方法,而是返回类型的默认值,如object返回null, int返回0等,否则通过指定when(方法).thenReturn(value)来指定方法的返回值。同时mock对象可以进行跟踪,使用verify方法看是否已经被调用过。而spy对象,默认会执行真实方法,返回值可以通过when.thenReturn进行覆盖。可见mock只
这种情况下单元测试就变得极其复杂,比如需要数据库或网络请求返回值的情况。
因此需要引入Mockito让单元测试变得简单,可以通过mock虚拟外部依赖,并可以通过打桩操作轻松地修改返回值甚至抛出异常:
(a)依赖(mock b)
二、Mockito环境设置
在应用Mock
mock方法时,总会因场景不同,调整参数的匹配情况。比如:某个参数是为了在数据库进行模糊查询的;或则精确匹配时,引用类型参数未实现equals方法。这时候就需要mock方法时,进行不同匹配。
1.参数精确匹配
Map mockMap = Mockito.mock(Map.class);
// 1.精确匹配
Mockito.when(mockMap.get(11)).thenReturn(111); // 基础类型
Mockito.when(mockMap.get(Li.
记得以前面试的时候,面试官问我,平常开发过程中自己会不会测试?我回答当然会呀,自己写的代码怎么不测呢。现在想想我好像误会他的意思了,他应该是想问我关于单元测试,集成测试以及背后相关的知识,然而当时说到测试,我也只知道 Junit。那么今天就说说开发过程中涉及到的测试以及相关的技术栈。
虽然测试分为单元测试,集成测试,系统测试等等,但是作为开发,我们可能不需要做这么多的测试(有时甚至不做……)接下来就说说和开发息息相关的单元测试以及集成测试。
单元测试就是模块测试,我的理解一个模块就是一个类,主要是指我们的 Service 模块,因为一个项目中大部分的业务逻辑都在 Service 层。我们专注测试 Service 中的方法即可。集成测试也就是多个模块的联合测试,Service 之间,Service 和 Dao 这种多个模块之间的综合测试。
说了测试的分类,那我们该怎么测试呢?我们常使用的就是 Junit 框架,说到测试,我之前一直没搞清楚,直到现在才有点头绪,不知道你们会不会遇到这种问题,在测试中若是涉及到 find 方法还好,但是涉及到修改数据的操作
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
当使用Mock模拟对象的方法调用时,分为有返回值和无返回值两种。
1、有返回值
when(对象.方法名(方法参数)).thenRe...
在上篇博客https://blog.csdn.net/cml_blog/article/details/82820753介绍了SpringBoot中进行单元测试各种小技巧后,发现还有个遗漏的case,那就是在使用的mock的时候,可能需要根据不同的参数返回不同的数据。比如传入aa返回true,传入bb返回false等情况,这里再补充一篇进行说明。
首先还是在AService中新增doSmthing...
单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。
单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。
单元测试代码里提供函数的使用示例,因为单元测试的具体表现形式就是对函数以各种不同输入参数组合进行调用。
2. 为什么要使用MOCK?
在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等)。 而我们没法