使用easymock-powermock模拟静态方法链调用的步骤如下:
@RunWith(PowerMockRunner.class)
注解来告诉JUnit使用PowerMockRunner来运行测试。@PrepareForTest
注解来指定需要被mock的类。在括号中列出需要mock的类的全限定名。PowerMock.mockStatic
方法来mock静态方法链调用的返回值。例如,如果需要mock类A的静态方法链调用A.method1().method2().method3()
,则可以使用以下代码:PowerMock.mockStatic(A.class);
EasyMock.expect(A.method1()).andReturn(mockA);
EasyMock.expect(mockA.method2()).andReturn(mockB);
EasyMock.expect(mockB.method3()).andReturn(mockResult);
PowerMock.replay(A.class, mockA, mockB);PowerMock.replay
方法来准备mock对象和类,以便在测试中使用。下面是一个完整的示例代码:
import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class) // 需要mock的类
public class MyTest {
@Test
public void testStaticMethodChain() {
// 创建mock对象
A mockA = EasyMock.createMock(A.class);
B mockB = EasyMock.createMock(B.class);
Result mockResult = EasyMock.createMock(Result.class);
// mock静态方法链调用
PowerMock.mockStatic(A.class);
EasyMock.expect(A.method1()).andReturn(mockA);
EasyMock.expect(mockA.method2()).andReturn(mockB);
EasyMock.expect(mockB.method3()).andReturn(mockResult);
PowerMock.replay(A.class, mockA, mockB);
// 执行测试代码,验证结果
// ...
// 验证mock的方法是否被调用
PowerMock.verifyAll();
}
}
在上述示例中,我们使用easymock和powermock来mock静态方法链调用。首先,我们使用PowerMock.mockStatic
方法来mock静态方法的返回值。然后,使用EasyMock.expect
方法来指定每个方法调用的返回值。最后,使用PowerMock.replay
方法准备mock对象和类。在测试代码中,我们可以执行需要测试的代码,并验证mock的方法是否被调用。
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
领取专属 10元无门槛券
手把手带您无忧上云