Java 测试仅在运行套件时获取HttpMediaTypeNotAcceptableException
我对Spring的发展还不熟悉,我正在努力学习。安装了Netbeans 11.1并克隆了它,并试图使此VideoController通过 我很惊讶为什么testAddGetVideo()测试在组中运行时失败,但在单独运行时通过。为此挣扎了几天。通读SO和其他帖子 testAddGetVideo在测试套件中失败,但个别测试通过(向下滚动查看下文) 在堆栈跟踪中有一个Java 测试仅在运行套件时获取HttpMediaTypeNotAcceptableException,java,spring,Java,Spring,我对Spring的发展还不熟悉,我正在努力学习。安装了Netbeans 11.1并克隆了它,并试图使此VideoController通过 我很惊讶为什么testAddGetVideo()测试在组中运行时失败,但在单独运行时通过。为此挣扎了几天。通读SO和其他帖子 testAddGetVideo在测试套件中失败,但个别测试通过(向下滚动查看下文) 在堆栈跟踪中有一个 org.springframework.web.HttpMediaTypeNotAcceptableException testA
org.springframework.web.HttpMediaTypeNotAcceptableException
testAddGetVideo():
在这里传输视频失败
发送无效id-9223372036854775808是测试的一部分
getVideos()失败。(日志输出的顺序有偏差)
…堆栈跟踪继续
但是,当我在不重新启动服务器的情况下立即运行单个测试时,它通过了
---------------newVideo---------------
video 3 at http://localhost:8080/video/3/data
===================
---------------getVideos---------------
3 videos
===================
个别测试通过
不确定原因,但下面的更改修复了它。问题可能与自动测试有关
@Test
public void testGetNonExistantVideosData() throws Exception {
long nonExistantId = getInvalidVideoId();
try{
Response r = videoSvc.getData(nonExistantId);
assertEquals(404, r.getStatus());
}catch(RetrofitError e){
assertEquals(404, e.getResponse().getStatus());
}
}
我的方法签名如下我将方法更改为在作为参数传入无效id时返回null,并且仅在传入有效id且二进制视频mpeg数据成功写入HttpServletResponse.Outputstream时返回VideoStatus
换句话说,执行响应.sendError()
也需要返回null代码>
@RequestMapping(value = VIDEO_DATA_PATH, method = RequestMethod.POST)
public @ResponseBody VideoStatus uploadVideo(@PathVariable("id") long id, @RequestParam("data") MultipartFile data, HttpServletResponse response) {
VideoStatus status = new VideoStatus(VideoStatus.VideoState.READY);
---------------newVideo---------------
video 1 at http://localhost:8080/video/1/data
===================
---------------uploadVideo---------------
1 for video 1 data data
===================
---------------downloadVideo---------------
1 for video 1
===================
---------------newVideo---------------
video 2 at http://localhost:8080/video/2/data
===================
---------------getVideos---------------
2 videos
===================
---------------uploadVideo---------------
-9223372036854775808 for non existent video
2019-09-09 14:50:28.988 WARN 16804 --- [tp1776486598-21] org.eclipse.jetty.server.Response : Committed before 406 null
2019-09-09 14:50:28.988 WARN 16804 --- [tp1776486598-21] .w.s.m.s.DefaultHandlerExceptionResolver : Handling of [org.springframework.web.HttpMediaTypeNotAcceptableException] resulted in Exception
java.lang.IllegalStateException: Committed
at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1242)
at org.eclipse.jetty.server.Response.sendError(Response.java:567)
at org.eclipse.jetty.server.Response.sendError(Response.java:544)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMediaTypeNotAcceptable(DefaultHandlerExceptionResolver.java:246)
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:119)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138)
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:75)
---------------newVideo---------------
video 3 at http://localhost:8080/video/3/data
===================
---------------getVideos---------------
3 videos
===================
@Test
public void testGetNonExistantVideosData() throws Exception {
long nonExistantId = getInvalidVideoId();
try{
Response r = videoSvc.getData(nonExistantId);
assertEquals(404, r.getStatus());
}catch(RetrofitError e){
assertEquals(404, e.getResponse().getStatus());
}
}
@RequestMapping(value = VIDEO_DATA_PATH, method = RequestMethod.POST)
public @ResponseBody VideoStatus uploadVideo(@PathVariable("id") long id, @RequestParam("data") MultipartFile data, HttpServletResponse response) {
VideoStatus status = new VideoStatus(VideoStatus.VideoState.READY);