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

JUnit4+Mockito单元测试ESAPI编码逻辑覆盖率不提升求解

问题根因

  • 你为测试目标类DgiQtyAction创建了Mock对象,Mockito默认不会执行Mock对象的真实方法,所有业务逻辑完全没有运行,自然不会统计到覆盖率
  • 请求参数名不匹配:业务代码中通过request.getParameter(EcoConstants.ecopidid)、request.getParameter(EcoConstants.pidid)取参数,你测试代码里添加的参数是ecopid、pid,就算走真实逻辑也取不到对应值
  • 业务代码直接new了NeedDgiBD实例,没有Mock的情况下会执行真实的外部依赖逻辑,容易抛出异常提前返回,走不到后续代码
  • 没有对ActionMapping.findForward方法打桩,执行到对应逻辑时会返回null,可能导致测试异常中断

整改步骤

  1. 去掉DgiQtyAction的Mock,直接实例化真实对象
  2. 修正请求参数名,和EcoConstants中定义的参数名保持一致
  3. 引入PowerMock拦截NeedDgiBD的构造方法,Mock其getDgiQty的返回值,屏蔽外部依赖
  4. 为ActionMapping.findForward打桩,返回合法的返回值
  5. 补充执行结果的断言,验证逻辑正确性

整改后测试代码示例

@RunWith(PowerMockRunner.class)
@PrepareForTest(DgiQtyAction.class) // 要拦截类内部new NeedDgiBD的逻辑,需要Prepare测试目标类
public class DgiQtyActionTest {
    ActionMapping am;
    ActionForm af;
    DgiQtyAction dat;
    private MockHttpSession mocksession;
    private MockHttpServletRequest mockrequest;
    private MockHttpServletResponse mockresponse;
    
    @Test
    public void fnDgiQty() throws Exception
    {
        // 初始化Mock对象
        mocksession = new MockHttpSession();
        mockrequest = new MockHttpServletRequest();
        mockresponse = new MockHttpServletResponse();
        am = mock(ActionMapping.class);
        af = mock(ActionForm.class);
        NeedDgiBD mockNiBD = mock(NeedDgiBD.class);
        
        // 基础配置
        mockrequest.setSession(mocksession);
        mocksession.setAttribute(EcoConstants.userBean,"userBean");
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(mockrequest));
        
        // 修正参数名,和业务代码取值对应
        mockrequest.addParameter(EcoConstants.ecopidid, "something");
        mockrequest.addParameter(EcoConstants.pidid, "<script>");
        
        // 打桩ActionMapping的findForward
        ActionForward successForward = new ActionForward();
        when(am.findForward(EcoConstants.SuccessInfo)).thenReturn(successForward);
        
        // 拦截NeedDgiBD的构造方法,返回Mock对象
        PowerMock.whenNew(NeedDgiBD.class).withNoArguments().thenReturn(mockNiBD);
        // 打桩getDgiQty返回空列表,走正常逻辑
        when(mockNiBD.getDgiQty("something")).thenReturn(new ArrayList());
        
        // 实例化真实的测试类,调用真实方法
        dat = new DgiQtyAction();
        ActionForward result = dat.fnDgiQty(am, af, mockrequest, mockresponse);
        
        // 断言验证
        assertNotNull(result);
        assertEquals(successForward, result);
        assertEquals("&lt;script&gt;", mockrequest.getAttribute(EcoConstants.pidId));
        
        // 验证ESAPI编码逻辑生效
        Encoder instance = ESAPI.encoder();
        assertEquals("&lt;script&gt;",instance.encodeForHTML(mockrequest.getParameter(EcoConstants.pidid)));
    }
}

内容的提问来源于stack exchange,提问作者Nagarjun Jeyachandran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:27:02