我目前正在尝试为我们的Servlet创建测试。 我已经模拟了HttpServletRequest
,HttpServletResponse
和充当数据库处理程序的对象。 在doPost
方法的测试中,我的愿望是比较来自Json对象和发送到数据库对象的ArrayList的值。
这个Servlet:
public class WidgetStatusServlet extends HttpServlet {
private DBController db = new DBController();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
JsonParser parser = new JsonParser();
JsonElement tradeElement = parser.parse(request.getParameter("widgetdata"));
JsonArray json = tradeElement.getAsJsonArray();
Gson gson = new Gson();
Type listType = new TypeToken<List<WidgetStatus>>() {
}.getType();
ArrayList<WidgetStatus> widgets = gson.fromJson(json, listType);
Iterator<WidgetStatus> iterator = widgets.iterator();
System.out.println("Widgets");
while (iterator.hasNext()) {
WidgetStatus node = (WidgetStatus) iterator.next();
System.out.println(node);
}
db.addWidgetStatus(widgets);
}
测试内容:
public class WidgetStatusServletTest {
@Captor
private ArgumentCaptor<ArrayList<WidgetStatus>> captor;
private DBController dbMock = mock(DBController.class);
private HttpServletRequest request = mock(HttpServletRequest.class);
private HttpServletResponse response = mock(HttpServletResponse.class);
Repository repository = mock(Repository.class);`
@Test
public void doPost_ShouldVerifyWidgetsIsProvided() throws Exception {
final WidgetStatus widget1 = new WidgetStatus("id1", "div_id1", "5", "5", "1", "2", false);
final WidgetStatus widget2 = new WidgetStatus("id2", "div_id2", "2", "1", "3", "1", true);
when(request.getParameter("widgetdata")).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
ArrayList<WidgetStatus> array = new ArrayList<WidgetStatus>();
array.add(widget1);
array.add(widget2);
String json = new Gson().toJson(array);
return json;
}
});
new WidgetStatusServlet().doPost(request, response);
verify(dbMock).addWidgetStatus(captor.capture());
assertNotNull(captor.getAllValues());
}
当我运行测试时,代码在这一行报错:NullpointerException
verify(dbMock).addWidgetStatus(captor.capture());
我做错了什么?我看了几个相同使用
ArgumentCaptor
的例子。也许这只是一个小错误?
WidgetStatusServlet
有自己的DBController
,与你创建的模拟控制器不同。如果你想让这个测试工作,你需要提供一种方法将你的模拟DBController
注入到WidgetStatusServlet
中。 - Dawood ibn Kareem