java中PowerMockito的使用

PowerMockito使用方法

//导入PowerMockito类
import org.powermock.api.mockito.PowerMockito;
//在单元测试的类中添加注解
@RunWith(PowerMockRunner.class)
//AirPrice.class这个是带测试的类
@PrepareForTest({AirPrice.class}) 
public class AirPriceTest {
}

使用场景举例

mock目标类的属性值

//自己定义的mock数据
Hashtable parameters = mockParameters();
//将自己的mock数据赋值到AirPrice类中,这样在AirPrice类中使用parameters这个属性的所有方法都能够使用我们的mock数据
PowerMockito.field(AirPrice.class, "parameters").set(AirPrice, parameters);

目标测试方法中new对象的如何mock

场景描述: 当目标测试方法中如果new 了一个对象,我们又不关注这个对象的处理过程时,可以mock他返回一个我们定义的mock对象。

//创建一个Service的mock对象
Service service = PowerMockito.mock(Service.class);
//当待测试的方法中new Service()对象时,使用我们定义的mock对象service			PowerMockito.whenNew(Service.class).withAnyArguments().thenReturn(service);

目标测试方法中new的对象调用方法的结果如何mock

//创建一个Service的mock对象
Service service = PowerMockito.mock(Service.class);
//当待测试的方法中new Service()对象时,使用我们定义的mock对象service			
PowerMockito.whenNew(Service.class).withAnyArguments().thenReturn(service);
//mock service.sendRQ()返回的内容,其中rsAdt,rsChd是我们定义的mock数据,这样使用当执行一次sendRQ方法时会返回rsAdt,当执行第二次sendRQ方法时会返回rsChd
PowerMockito.when(service.sendRQ(Mockito.argThat(new ArgumentMatcher<ReshopRQ>() {
	            @Override
	            public boolean matches(Object rq) {
	                return true;
	            }
	        }))).thenReturn(rsAdt).thenReturn(rsChd);

上述是结合Mockito来实现的,sendRQ中需要传递的是类对象,所以需要自己去实现返回结果,如果是其它的基础类型,可以使用Mockito.anyByte()等形式。

其余介绍

PowerMockito比较强大,可以mock目标测试的private方法和静态属性,因为目前没有用到,所以暂不介绍

PowerMockito 是一个Java测试框架,它扩展了其他流行测试框架(如Mockito),提供了Mock静态方法、私有方法、构造函数和final类等额外的功能。在PowerMockito,`@Replace` 注解可以用来在测试替换类的实现。 使用`@Replace`注解通常分为以下几个步骤: 1. 首先,确保你的测试类或者测试方法上有`@RunWith(PowerMockRunner.class)`注解。这是使用PowerMockito所必需的,因为PowerMockito需要使用它自己的运行器来支持额外的模拟功能。 ```java @RunWith(PowerMockRunner.class) public class MyTest { // 测试方法 } ``` 2. 接下来,在测试方法或者测试类上使用`@Replace`注解。你可以选择为整个类的实例替换方法,也可以为特定的方法替换。 使用在测试类上时,所有该类的实例化都会使用替换后的方法。使用在具体的测试方法上时,只有该方法的实例化会使用替换后的方法。 - 替换整个类实例: ```java @RunWith(PowerMockRunner.class) @PrepareForTest({MyClass.class}) @Replace(MyClass.class) public class MyTest { // 测试方法 } ``` - 替换类的特定方法: ```java @RunWith(PowerMockRunner.class) @PrepareForTest({MyClass.class}) public class MyTest { @Replace("myMethodName") public void testSpecificMethod() { MyClass myClass = new MyClass(); // 这里调用 myClass 的 myMethodName 时,将使用替换了的方法 } } ``` 请注意,使用`@Replace`注解时,你需要同时使用`@PrepareForTest`注解来指定哪些类的静态方法将被模拟。 - 相关问题--: 1. 使用PowerMockito时,如何准备一个静态方法进行测试? 2. 在PowerMockito,如何模拟私有方法? 3. 为什么在使用PowerMockito时需要指定`@PrepareForTest`注解?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Σ滴水成河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值