JUnit4+Mockito单元测试ESAPI编码逻辑覆盖率不提升求解
问题根因
- 你为测试目标类
DgiQtyAction创建了Mock对象,Mockito默认不会执行Mock对象的真实方法,所有业务逻辑完全没有运行,自然不会统计到覆盖率 - 请求参数名不匹配:业务代码中通过
request.getParameter(EcoConstants.ecopidid)、request.getParameter(EcoConstants.pidid)取参数,你测试代码里添加的参数是ecopid、pid,就算走真实逻辑也取不到对应值 - 业务代码直接new了
NeedDgiBD实例,没有Mock的情况下会执行真实的外部依赖逻辑,容易抛出异常提前返回,走不到后续代码 - 没有对
ActionMapping.findForward方法打桩,执行到对应逻辑时会返回null,可能导致测试异常中断
整改步骤
- 去掉
DgiQtyAction的Mock,直接实例化真实对象 - 修正请求参数名,和
EcoConstants中定义的参数名保持一致 - 引入PowerMock拦截
NeedDgiBD的构造方法,Mock其getDgiQty的返回值,屏蔽外部依赖 - 为
ActionMapping.findForward打桩,返回合法的返回值 - 补充执行结果的断言,验证逻辑正确性
整改后测试代码示例
@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("<script>", mockrequest.getAttribute(EcoConstants.pidId)); // 验证ESAPI编码逻辑生效 Encoder instance = ESAPI.encoder(); assertEquals("<script>",instance.encodeForHTML(mockrequest.getParameter(EcoConstants.pidid))); } }
内容的提问来源于stack exchange,提问作者Nagarjun Jeyachandran
相关产品推荐
相关产品推荐

