- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想用 http://www.easymock.org/ 测试我的 servlet
如何编写单元测试代码?
我根据您的回复更新我的代码。
我刚刚使用 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)
最佳答案
您需要同时模拟 HttpServletRequest
和 HttpServletResponse
对象。有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
}
关于java - 如何对 HTTPServlet 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404808/
我被告知这不是一个好的做法 @Autowired HttpServlet httpServlet; 在 Spring Boot 中,因为它只会为所有点击创建一个对象。我对 Spring Boot 和
我想知道反序列化后是否调用了 HttpServlet 的 init 方法。 我不知道是否有任何容器曾经序列化一个 servlet,但它实现了 Serializable 接口(interface),所以
我在 HttpServlet 文档中读到 HttpServlet 的子类必须重写至少一个方法,通常是以下方法之一: doGet, if the servlet supports HTTP GET re
我有几个在服务器端执行操作的 servlet。在一些上,我只是编码一些不必要的数据并将其发送回来,这似乎毫无意义。你必须回应吗?当您只说 return 时会发生什么?我以前这样做过,似乎没有什么问题,
我尝试创建一个文件,写入文件,然后将文件转换为输入流,并将其字节传输到 HTTP 响应的输出流。但我收到消息“/tmp/mozilla_xxxx/33JJ1OHw.md.part 无法保存,因为无法读
我正在开发一个具有两个 Web 界面的 Java 应用程序:一个处理某些 Web 服务逻辑的 servlet (/WSProxy) 和一个使用 Spring 框架的 Web 管理界面(/Admin 或
我在 Java EE 应用程序中使用 Apache Tomcat v8.0 服务器。基本上,我创建了一个 ResponseUpload servlet。我需要通过 POST 请求从 Web 应用程序获
这个问题在这里已经有了答案: How many instances are created for a HTTP servlet (2 个答案) 关闭 6 年前。 根据servlet的生命周期,se
我有一个 Web 应用程序,其中多个 servlet 使用一定数量的相同逻辑进行预初始化(设置日志记录、 session 跟踪等)。我所做的是在 javax.servlet.http.HttpServ
我有一个应用程序,用户正在访问 servlet 文件,该文件将有条件地读取 .pdf 文件并发送 .pdf 文件作为对用户请求的响应。 servlet 代码不会设置响应 header 的内容长度。 在
这个问题在这里已经有了答案: Http Servlet request lose params from POST body after read it once (13 个答案) 关闭 7 年前。
基本上,一个 servlet 实例存在多长时间?我有点猜测它是 session 范围。但是,我想它可能有某种超时或垃圾收集来删除旧实例。 最佳答案 当应用程序启动时(部署在 servlet 容器上)或
我需要一些帮助,我的意思是对这个继承设计的意见。 我创建了Controller.class,它扩展了HttpServlet和AjaxController.class 扩展了 Controller.cl
我想在扩展 HttpServlet 的类上注入(inject) DAO 依赖项,这可能吗?我不想从应用程序上下文中手动获取依赖项,但如果可能的话,希望在我的 Servlet 实例上进行真正的依赖项注入
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
假设,我有一个 TestServlet 类,它声明为全局字符串变量。如果同时调用 TestServlet 类,则此“消息”字符串变量是否可以安全地打印而无需从并发线程交叉? public class
我有一个扩展 HttpServlet 类的类。我知道 Java 是多线程的,不同的线程(阅读:HTTP 请求)可以使用同一个实例。我想在第一个请求时实例化一个对象并使用它直到 session 结束。
出于记录目的,我重写了 HttpServlet 的服务方法,如下所示: @Override protected void service(HttpServletRequest req, HttpSer
我对在 Google App Engine 上遇到的这个问题感到困惑。 我创建了几个servlet,因此我创建了一个基类来完成一些基本的重复工作。像这样: public class MyBase ex
我想用 http://www.easymock.org/ 测试我的 servlet 如何编写单元测试代码? 我根据您的回复更新我的代码。 我刚刚使用 Google 并制作了这段代码。 这是我的 Ser
我是一名优秀的程序员,十分优秀!