2016-12-14 114 views
0

我儘量讓單元測試上queryAction類的功能queryInfo ServletActionContext.getRequest():如何使用嘲笑JMockit

public class queryAction{ 
    public String queryInfo(){ 
    // do something... 
    // this line throw Exception 
    HttpServletRequest request = ServletActionContext.getRequest(); 
    String areaInfo = request.getParameter("paramJson"); 
    // do something... 
    } 
} 

單元測試運行時,報告了以下錯誤:

queryAction(com.huawei.provision.queryActionTest)已用時間:0.047 秒< < <錯誤! 顯示java.lang.NullPointerException:空 在org.apache.struts2.ServletActionContext.getRequest(ServletActionContext.java:112)

我查閱了一些問題和答案,如one way using Mockitoanother way using easymock但我還是不要不知道如何解決這個問題JMockit

+0

這將有助於顯示你已經嘗試過。你在單元測試中的嘗試在哪裏? – dcsohl

回答

0

我已經採取了這項測試的queryInfo()返回areaInfo的奢侈品。

對於你的情況,你應該使用@Mocked這兩個對象,並在期望中返回HttpServletRequest模擬ServletActionContext.getRequest()的調用。

package com.platypus; 

import static org.junit.Assert.assertEquals; 

import javax.servlet.http.HttpServletRequest; 

import org.junit.Test; 
import org.junit.runner.RunWith; 

import mockit.Expectations; 
import mockit.Mocked; 
import mockit.Tested; 
import mockit.integration.junit4.JMockit; 


@RunWith(JMockit.class) 
public class ServletActionContextTest 
{ 

    @Tested 
    private QueryAction queryAction; 

    @Mocked 
    private HttpServletRequest httpServletRequest; 
    @Mocked 
    private ServletActionContext servletActionContext; 

    @Test 
    public void test() 
      throws Exception 
    { 
     new Expectations(){{ 
      ServletActionContext.getRequest(); result = httpServletRequest; 
      httpServletRequest.getParameter("paramJson"); result = "foo"; 
     }}; 

     String queryInfo = queryAction.queryInfo(); 

     assertEquals("foo", queryInfo); 
    } 
} 
+0

你有什麼理由說靜態方法應該使用「僞裝」?在這些情況下,你完全可以使用'@ Mocked'。 – dcsohl

+0

對我來說是一種經驗法則,也許我應該重新思考它。 – Alfergon

+0

好電話@dcsohl不需要僞造;) – Alfergon