问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Mockito和嵌套的方法调用问题,怎么解决

发布网友 发布时间:2022-04-22 14:46

我来回答

1个回答

热心网友 时间:2023-10-18 20:45

Jmock和Mockito是常用的mock工具,Jmock功能相当强大,也比较容易用。Mockito 在处理多层嵌套时比较麻烦,下面说明了这种场景的主要用法。不过建议不是用jmock。

package com.jd.test;
 
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Mockito.when;
 
import javax.annotation.Resource;
 
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import com.jd.test.service.CustomerBusiness;
import com.jd.test.service.FeeBusiness;
import com.jd.test.service.OrderBusiness;
import com.jd.test.service.ProctBusiness;
import com.jd.test.service.impl.FeeBusinessImpl;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/spring-config.xml")
public class MockitoTest {
 

@Resource
@InjectMocks
private ProctBusiness injectProctBusiness;

@Mock
private OrderBusiness orderBusiness;

@Resource
@InjectMocks
private CustomerBusiness customerBusiness;

@Spy
private FeeBusiness feeBusiness = new FeeBusinessImpl();

 
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}

/**
 * 自动注入mock管理的bean. 解决二层和多层bean嵌套的部分mock场景。即injectProctBusiness->customerBusiness->feeBusiness 时,如果想mock feeBusiness中的某个方法. 
 * 
 * @Resource
@InjectMocks
private ProctBusiness injectProctBusiness;

@Resource
@InjectMocks
private CustomerBusiness customerBusiness;

@Spy
private FeeBusiness feeBusiness = new FeeBusinessImpl();
 * 
 *  @InjectMocks 标签会自动填充带@Spy和@Mock标签的bean.
 *  @Spy 被它代理的bean,默认执行原生方法。但可以在后期mock想要的方法。
 *  @Mock 相当于mockito帮助简单的实例化bean,因此无法执行原生方法。适用于整个bean都mock,如DAO。
 *   
 *  同时可以结合spring一起管理bean.对bean的管理应该是spring先进行一系列的如初始化bean操作,然后mockito会引用spring生成的bean,并对bean里的指定field进行重新注入。以达到实现部分mock功能 。
 */
@Test
public void injectClass() {

when(feeBusiness.getFee(anyLong())).thenReturn("spy inject");

assertEquals(injectProctBusiness.getCustomerName(1), "proctBusinessimpl->null");
assertEquals(injectProctBusiness.getCustomerPhone(2),"proctBusinessimpl->CustomerBusinessImpl->2");
assertEquals(injectProctBusiness.getOrderFee(3),"proctBusinessimpl->CustomerBusinessImpl->spy inject");


}
 
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
“晚来天欲雪,能饮一杯无?”是什么意思_出处及原文翻译_学习力 胸肌中部怎么练 血沉高是怎么回事,怎样才能降低啊! 中海锦江城多久交房 “QMS”作为“质量管理体系”的英文缩写,其背后理论及应用如何?_百度... 我用QQ登的快手绑定了一个电话号码,电话号码不用了,现在怎么能登得进去... 桂林银行白金客户条件 桂林银行最高等级卡 iQOO 11系列曝光,预计年底正式发布! vivo X90先别买?iQOO 11系列配置堪称豪华 股票里面的委比 委差是什么意思? 股票中委比和委差是什么意思? 拦截骚扰电话的软件叫什么名字。 生于鲍鱼死于鲍鱼 这句台词出自哪个电影? 潘长江演的那个喝鲍鱼粥的电影叫什么 "厂"与"场",这两个要怎么区别使用? 拦截骚扰电话哪个软件好用 梦见龙卷风有什么预兆?是什么意思? 生蚝烧烤还是清蒸好吃 有趣的实践活动作文 打骚扰电话的软件 梁汉文在二楼谈论阿婆晒鲍鱼的那个视频是什么电影 下载什么软件可以打骚扰电话 烤生蚝好吃还是蒸的好吃都怎么做谢谢! 腾讯云服务器怎么样?de 你觉得很贵的东西实际上很便宜的有啥? 能拦截骚扰电话的软件叫什么通 生蚝蒸和烤哪个有营养价值 电影里吃的是假鲍鱼是什么替代的 浠怎么读 怎么mockito方法的内部对象 Java如何用PowerMock测试 void类型的方法?请给出具体的实例谢谢 Mockito为什么不能mock静态方法 如何用mockito+spring进行单元测试 mockito和junit的区别 如何用mockito+spring测试 如何使用powermockito Mockito怎么样Mock返回值为空的方法 如何对Java单例模式进行mock 如何测试私有 Private/Internal 方法 mock测试的mock对象实例 如何使用Mock来测试Files,Database和ContentProviders 如何嘲笑私有方法使用PowerMock测试 关于Mock测试 关于c# mock 怎么快速mock api 苹果A2217为什么比A2223贵呢? 武汉姑娘大马遇难是怎么回事? 马来西亚恒源炼油厂新任CEO 马来西亚海欧集团ceo是谁