You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:15:03