首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在用Mockito做单元测试时如何使用doAnswer…when

添加关注 刚使用Mockito来做Java项目的单元测试时,对doAnswer…when使用场合不怎么理解,查了Mockito官方文档和网上各种资料,感觉都说得不够清楚。...原来,doAnswer…when和when…thenReturn功能类似,都是用于给模拟对象指定调用其方法返回值,只不过二者有如下区别: 01 when…thenReturn: 当我们为模拟对象指定调用其方法返回值时..., when…thenReturn用于直接返回一个简单值。...02 doAnswer…when: 当模拟对象调用它方法,需要执行一些操作(其实就是需要执行一个代码块)才能得到返回值时,则需要使用doAnswer来构造产生这个模拟返回值。...例如:当模拟对象调用某个方法返回值是个复合值(bean)时,就需要用doAnswer来构造该返回值。

10.6K10
您找到你想要的搜索结果了吗?
是的
没有找到

Java单元测试框架之Mockito指南

mock 函数默认返回是 null,一个空集合或者一个被对象类型包装内置类型,例如 0、false 对应对象类型为 Integer、Boolean; 一旦测试桩函数被调用,该函数将会一致返回固定值...建议使用方法层面的验证,:never();// 在验证是否有冗余调用时候,可使用此种方式。...(可代替参数匹配器使用) 在某些场景,不光要对方法返回值和调用进行验证,同时需要验证一系列交互后所传入方法参数。那么我们可以用参数捕获器来捕获传入方法参数进行验证,看它是否符合我们要求。...两种部分 mock 实现,spy、callRealMethod:mockito两种部分mock实现,spy、callRealMethod - 沧海一滴 - 博客园 Mockito 中被 Mocked...对象属性及方法默认值:Mockito 中被 Mocked 对象属性及方法默认值 - Boblim - 博客园 单元测试工具之 Mockito:单元测试工具之Mockito_mockito作用-

35010

SpringBoot - 单元测试利器Mockito入门

举个例子: 类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类 D、E、F 等,假设类 D 是一个外部服务,那就会很难测,因为你返回结果会直接受外部服务影响,导致你单元测试可能今天会过...像是 Mockito 可以在单元测试模拟一个 Service 返回数据,而不会真正去调用该 Service,通过模拟一个假 Service 对象,来快速测试当前想要测试类。...当我们创建了一个假 userDao 后,我们需要为这个 mock userDao 自定义方法返回值,这里有一个公式用法,下面这段代码意思为,当调用了某个 Mock 对象方法时,就回我们想要自定义结果...()方法,并且参数为3时,就返回id为200、name为I'm mock3user对象 Mockito.when(userDao.getUserById(3)).thenReturn(...---- thenReturn 当使用任何整数值调用 userService getUserById() 方法时,就回一个名字为Aritisan User 对象。

14.3K42

SpringBoot 单元测试利器-Mockito

mock 测试就是在测试过程,创建一个假对象,避免你为了测试一个方法,却要自行构建整个 bean 依赖链 像是以下这张图,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类...管理 bean、模拟方法返回值、模拟抛出异常...等,他同时也会记录调用这些模拟方法参数、调用顺序,从而可以校验出这个 mock 对象是否有被正确顺序调用,以及按照期望参数被调用 像是 Mockito...userDao 自定义方法返回值,这里有一个公式用法,下面这段代码意思为,当调用了某个 mock 对象方法时,就回我们想要自定义结果 Mockito.when( 对象.方法名() ).thenReturn...()方法,并且参数为3时,就返回id为200、name为I'm mock3user对象 Mockito.when(userDao.getUserById(3)).thenReturn(...除了最基本 Mockito.when( 对象.方法名() ).thenReturn( 自定义结果 ),还提供了其他用法让我们使用 thenReturn 系列方法 当使用任何整数值调用 userService

2.5K10

使用强大 Mockito 来测试你代码

一个可行消除方法是替换掉依赖类(测试替换),也就是说我们可以使用替身来替换掉真正依赖对象。 2.2 测试类分类 dummy object 做为参数递给方法但是绝对不会被使用。...譬如说,这种测试类内部方法不会被调用,或者是用来填充某个方法参数。 Fake 是真正接口或抽象类实现体,但给对象内部实现很简单。譬如说,它存在内存而不是真正数据库。...when(….).thenReturn(….)可以被用来定义当条件满足时函数返回值,如果你需要定义多个返回值,可以多次定义。...当你多次调用函数时候,Mockito 会根据你定义先后顺序来返回返回值。Mocks 还可以根据传入参数不同来定义不同返回值。...所以我们可以用来验证函数在传入特定参数时候是否被调用。这种方式测试称行为测试,行为测试并不会检查函数返回值,而是检查在传入正确参数时候函数是否被调用。

10.4K60

#Android单元测试学习总结「建议收藏」

when()来解决一些问题., 当你需要下面这些功能时这是必须: 测试void函数 在受监控对象上测试函数 不只一次测试同一个函数,在测试过程改变mock对象行为 4.....thenReturn("element"); // 使用自定义参数匹配器( 在isValid()函数返回你自己匹配器实现 ) when(mockedList.contains(argThat(isValid...").thenReturn(file)方法模拟创建File操作,当File类以aaa参数创建时候返回已经mock出来file对象。...,因此传递Mockito任何验证方法次数函数都可以,Mockito验证函数返回是一个VerificationMode类型。...使用真实返回值 如果在测试过程又遇到不需要mock出来静态方法模拟返回值,而是需要真实返回值,怎么办呢,其实跟Mockito一样,PowerMockito同样提供thenCallRealMethod

4.8K20

Head First Android Testing 1

Android Annotation对EBean类构造函数有个限制,要么不提供构造函数只用默认构造函数,要么提供一个只包含参数Context构造函数。...前者只运行当前测试运行参数配置测试类和方法,而后者会检测整个项目中所有Unit Test并进行测试。 上面四个测试只有前三个是通过,最后一个没能通过。...(最后一个测试方法问题出在ObjectOutputStream对象创建时候,因为当前处于Unit Test,没有设备或者模拟器所以没法直接写文件,对于这类特殊测试就不能使用Unit Test,而是使用第二节...not mocked.”...testOptions { unitTests.returnDefaultValues = true } } [文件android.jar并不包含实际代码,所有方法都只是空盒子,默认情况下都会抛出异常

60120

JAVA实战:如何让单元测试覆盖率达到80%甚至以上

(几乎不会使用)Mockito.when( 对象.方法名() ).thenReturn( 自定义结果 ):后面自定返回结果,需要和方法返回结果类型一致,Mockito.any():用于匹配任意类型参数详细版...在测试代码,当需要匹配方法参数但不关心具体参数值时,可以使用Mockito.any()方法来匹配参数。...具体来说,Mockito.any()方法可以用于模拟对象方法调用或验证方法调用时参数匹配。需要注意是,当使用Mockito.any()方法时,需要确保模拟方法返回值与模拟方法参数类型兼容。...mock模拟Mockito.when( 对象.方法名() ).thenReturn( 自定义结果 ),方法名()参数有的人会使用实际参数,这样会导致模拟是无法找到正确结果。...这个是因为有时模拟时参数类型不正确原因,参考:Mockito 多种匹配函数。如果还是报错,建议使用准确值,比如参数为int=1。但就会出现问题一无法返回结果。有知道大佬可以评论。

3K20

junit4整合PowerMockito进行单元测试

,单测要覆盖到方法每一行代码 自动断言:每一段单测代码都应该有自己断言方法,而不是通过打印再人工查看正确性 所以我们就有了Mockito,它可以模拟对象,模拟对象方法返回值,来完成mock...三、其他使用 1)如何对无返回方法进行断言 假设有一个无返回方法,我们要针对它进行测试。...由于它没有返回值,就没有办法对其返回值进行断言校验。 那么针对这种情况,一个方法,就算是无返回情况。内部一定做了一些什么操作。...所以我们一般有两种方式 这个方法做了设置某个对象属性,我们可以校验对象属性是否符合预期 第二章初步使用就是如此 如果这个方法执行了某段逻辑分支代码,我们可以可以校验那段代码是否执行过...有些时候,代码是会发生异常,那么在单测环境下,我们需要判断这些异常是什么,是不是符合预期 如下这个方法,我们只需要个null,就会发生NullPointException异常 package

69530

Java单元测试Mock工具Mockito介绍

一、什么是Mock&为什么要Mock Mock就是在测试过程对于那些不容易构建依赖进行模拟,以保证系统测试流程可以正常运行,即生成一个和实际使用场景不一样对象; 为什么需要Mock呢?...1、在测试环境构建一些依赖成本比较高 如一些硬件操作,像串口和USB输入; 还有一些第三方依赖,像支付系统要调用很多外部支付网关,如果直接调用生产环境网关就会产生脏数据问题;...,在添加帖子时候需要调用用户服务来查询用户信息,这里不讨论代码组织是否合理,是否用到了DDD,只是一个例子说明如何使用Mockito; 先看看spy方法如何Mock: import static org.mockito.Mockito.spy...Mockito.when(..).thenReturn when方法thenReturn传递要返回结果,如果when要带参数,一般是这样格式, Mockito.anyInt(),Mockito定义了很多常用类型...Mock掉,of静态方法没有设置返回值会报错

3.2K40

Android开发之逻辑单元测试

工具jMock 、EasyMock 、Mockito等都有一个共同缺点:不能mock静态、final、私有方法等。...doReturn和thenReturn区别了,thenReturn之前when里参数是可以调用响应方法,但是doReturn后面的when只能是一个Object类型参数 List list =...).handle(Mockito.any(PushRequest.class), Mockito.any(PushResponse.class)); 对于一个new出来对象,我们想控制该对象某些方法返回值...); 如果是用以上方式去mock出来对象,那么是通过默认空参数构造函数去mock,想通过自定义带参数构造函数去mock可用如下方式: SyncInformHandler syncInformHandler...,验证方法被调用次数;有时候一个方法并没有返回值,所以没办法通过判断返回方式来验证结果是否是我们锁预期,因此可通过检测方法某一个子方法是否被调用过,被调用次数来检测是否符合我们预期: 验证

1.3K10

Mockito和PowerMock用法

在单元测试,我们往往想去独立地去测一个类某个方法,但是这个类可不是独立,它会去调用一些其它类方法和service,这也就导致了以下两个问题:外部服务可能无法在单元测试环境中正常工作,因为它们可能需要访问数据库或者使用一些其它外部系统...一、mock测试和Mock对象 mock对象就是在调试期间用来作为真实对象替代品 mock测试就是在测试过程,对那些不容易构建对象用一个虚拟对象来代替测试方法就叫mock测试 二、Mockito...PowerMock可以实现完成对private/static/final方法Mock(模拟),而Mockito可以对普通方法进行Mock,:public等。...()).thenReturn("xiaohong"); // 3、mockito模拟测试无返回方法 Person person =mock(Person.class); doNothing().when...,调用不了它真实方法,但是spy() 或者@spy 可以监视一个真实对象,对它进行方法调用时它将调用真实方法,同时也可以设定这个对象方法让它返回我们期望值。

2.8K32

单元测试(Spring)

针对DAO层测试方法和Service层测试方法类似。 示例:(Service、DAO)参数化测试 参数化测试主要是用于测试分支语句,多个参数覆盖if…else等判断语句中分支,使测试更全面。...; (2)为测试类声明几个变量,分别用于存放期望值和测试所用数据; (3)为测试类声明一个带有参数公共构造函数,并在其中为第二个环节声明几个变量赋值; (4)为测试类声明一个使用注解org.junit.runners.Parameterized.Parameters...修饰返回值为 java.util.Collection公共静态方法,并在此方法初始化所有需要测试参数对; (5)编写测试方法,使用定义变量作为参数进行测试。...null,没有对方法调用返回值做模拟 模拟方法调用返回值 1 Mockito.when(mockedList.get(0)).thenReturn("first"); 2...当测试方法需调用依赖方法时便返回模拟值,从而达到隔离测试目的。

4.7K10
领券