2013-01-18 134 views
3

我想測試我的servlet與http://www.easymock.org/單元測試HTTPServlet如何?

如何編寫單元測試代碼?

我更新我的代碼與你的迴應。

我剛剛使用Google並現在創建了此代碼。

這裏是我的Servlet:

package com.i4ware.plugin.timesheet; 

import java.io.IOException; 

import com.atlassian.jira.issue.Issue; 
import com.atlassian.jira.issue.IssueManager; 
import com.atlassian.jira.project.Project; 
import com.atlassian.jira.project.ProjectManager; 
import org.ofbiz.core.entity.DelegatorInterface; 
import org.ofbiz.core.entity.EntityExpr; 
import org.ofbiz.core.entity.EntityOperator; 
import org.ofbiz.core.entity.GenericEntityException; 
import org.ofbiz.core.entity.GenericValue; 
import org.ofbiz.core.util.UtilMisc; 
import org.apache.commons.lang.StringEscapeUtils; 
import com.atlassian.crowd.embedded.api.User; 
import com.atlassian.jira.security.JiraAuthenticationContext; 
import com.atlassian.jira.web.bean.PagerFilter; 
import com.atlassian.jira.issue.search.SearchResults; 
import com.atlassian.jira.bc.issue.search.SearchService; 
import com.atlassian.jira.issue.search.SearchException; 

import com.atlassian.jira.issue.worklog.Worklog; 
import com.atlassian.jira.issue.worklog.WorklogManager; 
import com.atlassian.jira.issue.worklog.WorklogImpl; 

import com.atlassian.query.Query; 
import com.atlassian.jira.jql.builder.JqlQueryBuilder; 
import com.atlassian.query.order.SortOrder; 

import com.atlassian.jira.issue.status.Status; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.atlassian.jira.util.json.JSONObject; 
import com.atlassian.jira.util.json.JSONException; 
import com.atlassian.jira.util.json.JSONArray; 

import java.io.UnsupportedEncodingException; 
import java.sql.Timestamp; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Hashtable; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import java.util.TimeZone; 
import java.util.TreeMap; 
import java.util.TreeSet; 
import java.util.Collections; 
import java.lang.Long; 
import java.util.Collection; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.lang.Class; 
import java.util.Enumeration; 

import org.apache.log4j.Category; 

import com.atlassian.upm.api.license.entity.PluginLicense; 
import com.atlassian.upm.license.storage.lib.PluginLicenseStoragePluginUnresolvedException; 
import com.atlassian.upm.license.storage.lib.ThirdPartyPluginLicenseStorageManager; 

import com.atlassian.plugin.webresource.WebResourceManager; 
import com.atlassian.templaterenderer.TemplateRenderer; 

import java.text.ParseException; 
import java.text.ParsePosition; 

public class UserIsLogedInServlet extends HttpServlet 
{ 
private static final Category log = Category.getInstance(UserIsLogedInServlet.class); 
/** value is made for JSON {"success":true} or {"success":false}. */ 
private Boolean value;  

private String json; 
private String msg; 
private final ThirdPartyPluginLicenseStorageManager licenseManager; 
private WebResourceManager webResourceManager; 
private final TemplateRenderer renderer; 

private JiraAuthenticationContext authenticationContext;  

public UserIsLogedInServlet(ThirdPartyPluginLicenseStorageManager licenseManager, 
     WebResourceManager webResourceManager, 
     TemplateRenderer renderer, 
     JiraAuthenticationContext authenticationContext) 
{ 
    this.licenseManager = licenseManager; 
    this.webResourceManager = webResourceManager; 
    this.renderer = renderer; 
    this.authenticationContext = authenticationContext; 
} 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{ 
    resp.setContentType("application/json");   

} 

@Override 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
{  

    User targetUser = authenticationContext.getLoggedInUser(); 

    String user = ""; 

    if (targetUser==null) { 

     user = "anonymous"; 
     value = Boolean.valueOf(!"false" 
      .equalsIgnoreCase((String) "false")); 
     msg = "You're not loged in."; 
    } else { 

     user = targetUser.getName(); 
     value = Boolean.valueOf(!"false" 
      .equalsIgnoreCase((String) "true")); 
     msg = "You're loged in."; 
    }   

    try { 

    json = new JSONObject()  
    .put("msg", msg) 
    .put("success", value) 
    .toString(); 

    } catch (JSONException err) { 
     err.printStackTrace(); 
     System.out.println("Got an JSONException: " + err.getCause()); 
    } 

    resp.setContentType("application/json");   
    resp.getWriter().write(json); 
    resp.getWriter().close(); 

} 
} 

這裏是代碼:

package com.i4ware.plugin.timesheet; 

import junit.framework.*; 
import org.junit.Ignore; 
import org.junit.Test; 
import org.junit.BeforeClass; 
import org.junit.After; 
import java.io.*; 
import java.security.*; 
import javax.servlet.http.*; 
import javax.servlet.ServletException; 
import javax.servlet.RequestDispatcher; 
import static org.easymock.EasyMock.*; 
import org.easymock.IMocksControl; 
import com.atlassian.upm.api.license.entity.PluginLicense; 
import com.atlassian.upm.license.storage.lib.PluginLicenseStoragePluginUnresolvedException; 
import com.atlassian.upm.license.storage.lib.ThirdPartyPluginLicenseStorageManager; 
import com.atlassian.plugin.webresource.WebResourceManager; 
import com.atlassian.templaterenderer.TemplateRenderer; 
import com.atlassian.jira.security.JiraAuthenticationContext; 

import com.i4ware.plugin.timesheet.UserIsLogedInServlet; 

public class UserIsLogedInServletTest extends TestCase {  

private ThirdPartyPluginLicenseStorageManager licenseManager; 
private WebResourceManager webResourceManager; 
private TemplateRenderer renderer; 
private JiraAuthenticationContext authenticationContext; 

private IMocksControl mocks; 
private UserIsLogedInServlet servlet; 

@BeforeClass 
public void setUpBeforeClass() { 
    mocks = (IMocksControl) createStrictControl(); 
    servlet = new UserIsLogedInServlet(licenseManager,webResourceManager,renderer,authenticationContext); 
} 

@After 
public void tearDown() { 
    mocks.reset(); 
} 

@Test 
public void testGet()throws ServletException, IOException { 
    HttpServletRequest request = mocks.createMock(HttpServletRequest.class); 
    HttpServletResponse response = mocks.createMock(HttpServletResponse.class); 
expect(request.getRequestDispatcher("/plugins/servlet/timesheet/userislogedin")).andReturn(createMock(RequestDispatcher.class)); 
    replay(request, response); 
    servlet.doGet(request, response); 
    verify(request, response); 
} 

@Test 
public void testPost() throws ServletException, IOException { 
    HttpServletRequest request = mocks.createMock(HttpServletRequest.class); 
    HttpServletResponse response = mocks.createMock(HttpServletResponse.class); 
expect(request.getRequestDispatcher("/plugins/servlet/timesheet/userislogedin")).andReturn(createMock(RequestDispatcher.class)); 
    replay(request, response); 
    servlet.doPost(request, response); 
    verify(request, response); 
} 

} 

我得到這個錯誤:

Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.046 sec <<< FAILURE! 
testPost(com.i4ware.plugin.timesheet.UserIsLogedInServletTest) Time elapsed: 0.01 sec <<< ERROR! 
java.lang.NullPointerException 
at com.i4ware.plugin.timesheet.UserIsLogedInServletTest.testPost(UserIsLogedInServletTest.java:67) 

testGet(com.i4ware.plugin.timesheet.UserIsLogedInServletTest) Time elapsed: 0 sec <<< ERROR! 
java.lang.NullPointerException 
at com.i4ware.plugin.timesheet.UserIsLogedInServletTest.testGet(UserIsLogedInServletTest.java:58) 
+0

見http://stackoverflow.com/questions/53532/unit-testing-servlets – Raedwald

回答

3

我比較熟悉的Mockito,但我相信他們仍然是相似的。事實上,我認爲幾年前Mockito從EasyMock分支出來。

沒有食譜的單元測試方法,但是這是基本的方法,我傾向於採取:

1)創建你的servlet類的真實實例(即新MyServlet()

2)使用EasyMock創建模擬HttpRequest

2a)模擬請求的期望行爲以模擬真實的HTTP請求。例如,這可能意味着你模擬了請求參數或標題的存在。

3)創建使用EasyMock的

4)調用你的servlet的doGet()方法將其傳遞兩個模擬請求和響應一個模擬的HttpResponse。

5)爲了驗證,檢查模擬HttpResponse。驗證:(a)在對象上調用了期望的方法,(b)期望的數據已經傳遞給對象。

我知道這是非常高級的,但我只是概述了方法。我假設你知道如何使用EasyMock完成模擬/驗證行爲。

希望這是有幫助的。

+0

我更新了我的問題。 –

+0

好吧,我沒有看到你的servlet類的源代碼,但是編譯錯誤表明沒有該類的默認構造函數(即public UserIsLogedInServlet())。所以你的選擇將是(1)添加一個默認構造函數到類OR(2)在你的測試中,調用可能已經定義的任何構造函數.......這將有助於查看你的servlet的源代碼。 – EJK

+0

我用我的servlet的源代碼更新了我的問題。 –

5

您需要模擬兩個HttpServletRequestHttpServletResponse對象。與標準模擬相比,有existing implementations,easier to use

一旦你的請求和響應的情況下,你按照這個模式:

private final MyServlet servlet = new MyServlet(); 

@Test 
public void testServlet() { 
    //given 
    MockHttpServletRequest req = //... 
    MockHttpServletResponse resp = //... 

    //when 
    servlet.service(req, resp); 

    //then 
    //verify response headers and body here 
} 
0

我更喜歡使用spring-test和MockHttpServletRequest和MockHttpServletResponse。他們比嘲笑更像存根,但工作得很好。

此答案的信息有關的用法:How to test my servlet using JUnit

+0

我把什麼放在pom.xml依賴? –