如何为指定Java业务方法编写对应场景的Unit Test Case单元测试用例
私有Java方法getBillingAgreementApprovalUrl单元测试编写方案
测试前置说明
这个方法是类私有方法,测试前需要先解决私有方法调用问题,可选方案包括用反射工具类直接调用,或引入PowerMock测试框架支持私有方法调用。
另外方法涉及多个外部依赖,需要先通过Mock工具(推荐Mockito)模拟所有依赖实例,避免调用真实外部逻辑:
- 需要Mock的入参依赖:
ScimRequest、PaymentsManager、TokenContext - 需要Mock的类成员依赖:
tokenManager
核心测试校验点
你需要覆盖以下几个业务逻辑校验点:
StringBuilder类型的calMsg参数正确拼接了&settingUpBillingAgreements和&baApprovalUrl=+审批地址两段内容pm.createBillingAgreement方法确实被传入了scimRequest参数调用tokenContext.setPaymentDetails方法被传入了pm.createBillingAgreement返回的PaymentDetails实例tokenManager.persistTokenContext方法确实被传入了scimRequest参数调用- 返回的
Link对象三个属性符合预期:href为审批地址、rel为approval_url、method为REDIRECT
完整测试用例示例
以下是基于JUnit 4 + Mockito的测试代码示例:
import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.lang.reflect.Method; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class YourClassNameTest { // 替换为你实际的业务类名 @InjectMocks private YourClassName targetClass; @Mock private TokenManager tokenManager; @Mock private ScimRequest scimRequest; @Mock private PaymentsManager paymentsManager; @Mock private TokenContext tokenContext; @Mock private PaymentDetails paymentDetails; @Test public void testGetBillingAgreementApprovalUrl() throws Exception { // 1. 构造测试桩数据 String testApprovalUrl = "https://test.billing.approve.com/ba_123"; StringBuilder testCalMsg = new StringBuilder(); when(paymentsManager.createBillingAgreement(scimRequest)).thenReturn(paymentDetails); when(paymentDetails.getBillingAgreementApprovalUrl()).thenReturn(testApprovalUrl); // 2. 反射调用私有方法 Method method = YourClassName.class.getDeclaredMethod("getBillingAgreementApprovalUrl", ScimRequest.class, PaymentsManager.class, TokenContext.class, StringBuilder.class); method.setAccessible(true); Link result = (Link) method.invoke(targetClass, scimRequest, paymentsManager, tokenContext, testCalMsg); // 3. 逻辑校验 // 校验calMsg拼接结果正确 assertTrue(testCalMsg.toString().contains("&settingUpBillingAgreements")); assertTrue(testCalMsg.toString().contains("&baApprovalUrl=" + testApprovalUrl)); // 校验依赖方法调用次数和入参符合预期 verify(paymentsManager, times(1)).createBillingAgreement(scimRequest); verify(tokenContext, times(1)).setPaymentDetails(paymentDetails); verify(tokenManager, times(1)).persistTokenContext(scimRequest); // 校验返回Link对象属性符合预期 assertEquals(testApprovalUrl, result.getHref()); assertEquals("approval_url", result.getRel()); assertEquals("REDIRECT", result.getMethod()); } }
内容的提问来源于stack exchange,提问作者ARP
相关产品推荐
相关产品推荐

