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

PowerMock whenNew不返回模拟对象

PowerMock是一个Java测试框架,用于解决一些传统的Java测试工具无法解决的问题。PowerMock whenNew是PowerMock框架中的一个功能,用于在测试中模拟和控制对特定类构造函数的调用。

当使用PowerMock的whenNew方法时,它允许我们模拟构造函数的行为,并返回我们自定义的模拟对象,而不是实际的对象实例。然而,有时当使用PowerMock whenNew时,它可能无法返回模拟对象。可能会出现以下几种情况:

  1. 类没有正确地被PowerMock框架所加载:这可能是因为没有正确设置PowerMockRunner或PowerMockRule,或者类没有使用PowerMockito.mockStatic进行静态方法的模拟。确保正确配置PowerMock框架以及对相关类进行正确的模拟。
  2. 类的构造函数不可模拟:某些类的构造函数可能不适合被模拟,例如私有构造函数、本地构造函数、静态构造函数等。在这种情况下,PowerMock whenNew无法返回模拟对象。
  3. 构造函数中存在无法处理的逻辑:某些构造函数可能包含复杂的逻辑或外部依赖,这可能会导致PowerMock whenNew无法成功模拟并返回模拟对象。

解决这些问题的方法可能因具体情况而异,但以下是一些常见的解决方案:

  1. 确保正确使用PowerMock框架:正确设置PowerMockRunner或PowerMockRule,并使用PowerMockito.mockStatic模拟相关的静态方法。
  2. 检查构造函数的可模拟性:确保所需模拟的类的构造函数是public的,并且没有其他限制,如final、private等。
  3. 简化构造函数逻辑:尽量将构造函数的逻辑简化,避免复杂的操作和外部依赖。如果可能的话,考虑将逻辑移至其他方法中,并在构造函数中调用这些方法。

总之,PowerMock whenNew用于模拟和控制对特定类构造函数的调用。但在某些情况下,可能会出现无法返回模拟对象的问题,可能是因为PowerMock框架配置不正确、构造函数不可模拟或构造函数中存在无法处理的逻辑。解决这些问题需要细致地检查和调试代码,并根据具体情况采取适当的解决方案。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何实现时间穿越?PowerMock系列之2

在笔者测试的某些系统中,存在一些与时间相关的系统功能。如某个程序会在每天的指定时间,如下午6点被触发,完成与外部公司的数据交换。 在系统测试时,往往需要通过修改linux的系统时间等方式来触发上述功能进而完成测试过程。这时非常不方便的,而且有时候还会因为修改了操作系统时间忘记改回,导致其它应用产生问题,如连接超时等。当然也有在隔离网络内提供NTP时钟服务的方案,只是需要网络层面的支持,测试成本较高,一般用于系统测试中。 而在单元测试时,为了不受外部约束,保证测试用例的健壮性,需要对系统时间进行mock。如以下的一个被测方法

01

玩花招的PowerMock

当我们面对一个遗留系统时,常见的问题是没有测试。正如Michael Feathers在Working Effectively with Legacy Code一书中对“遗留代码”的定义。他将其简单归纳为“没有测试的代码”。真是太贴切了!正是因为没有测试,使得我们对遗留代码的任何重构都有些战战兢兢,甚至成为开发人员抵制重构的借口。从收益与成本的比例来看,对于这样的系统,我一贯认为不要盲目进行重构。因为重构的真正适用场景其实是发生在开发期间,而非维护期间。当然,提升自己的重构能力,尤其学会运用IDE提供的自动重构工具,可以在一定程度上保障重构的质量。然而,安全的做法,还是需要为其编写测试。

02

EasyMock PowerMock 的简单使用(with spring Autowired)


import java.math.BigDecimal;

import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.util.ReflectionTestUtils;

@RunWith(PowerMockRunner.class)
@PrepareForTest( { PaymentReconService.class })
@PowerMockIgnore(“org.apache.log4j.*”)
public class PaymentGatherServiceTest extends PaymentServiceTestBase {

@Autowired
private GatherService gatherResultService;
@Autowired
private PaymentBaseDAO baseDAO;

/**
* 测试正常postback
*/
public void testPaymentSucc() {
PaymentReconService mock = mock();

Long pbId = 10004L;
String pbStatus = PaymentBaseEO.PB_STATUS_GATHER_SUCC;
BigDecimal succAmount = new BigDecimal(“99.3”);

try {
GatherOrderRO ro = gatherResultService.processPaymentGather(pbId, pbStatus, succAmount, succAmount);
assertNotNull(ro);

} catch (SystemException e) {
fail(e.getLocalizedMessage());
} catch (BusinessException e) {
fail(e.getBusinessCode());
}
EasyMock.verify(mock);
}

/**
* MOCK PaymentReconService实现
* @return
*/
private PaymentReconService mock() {
PaymentReconRO mockRO = new PaymentReconRO(PaymentReconRO.Status.SUCESS, “OK”);

PaymentReconService mock = EasyMock.createMock(PaymentReconServiceImpl.class);
EasyMock.expect(mock.paymentSuccessRecon(EasyMock.anyObject(Long.class))).andReturn(mockRO);
EasyMock.replay(mock);
//这里把依赖的数据注进去
ReflectionTestUtils.s

03
领券