目前我正在开发一个基于弹簧的应用程序。我确实为应用程序的许多目的进行了一些单元测试。问题是,我还没有找到任何解决方案来对我的应用程序进行真正的集成测试。
让我给你举个例子:
在我当前的测试中,我确实为特定控制器设置了一个请求,并将这些组件传递给我的处理程序:
// setup request
request.setMethod("GET");
request.setRequestURI("/customer");
request.addHeader("Accept", "application/json");
request.addHeader("Authorization", "Basic xyz"); // base_64
handlerAdapter.handle(request, response, myController);
但这不是真正的集成测试,因为我的意思是,好吧我确实有一个请求,myController 应该处理这个请求。
这是一个问题,因为我真正想要测试的是以下内容:
我确实有一个请求,我的应用程序应该处理这个请求。我不想指定控制器,因为如果正在运行的应用程序和对“/customer”的请求,spring 会调度哪个控制器来解决我的请求。我真的很想模拟我是一个浏览器或另一个向我的后端发送请求的客户端。
我想测试这个的原因是,否则某种测试会通过,尽管测试的功能在“现实世界”中不起作用
我可以给你这个例子来理解测试与生产运行的不同之处:
假设我确实在带有参数的表单中上传了文件。我的控制器功能是这个:
@RequestMapping(value="/{id}", method = RequestMethod.PUT, headers="content-type=multipart/form-data")
public ResponseEntity<String> createFromMyForm(@PathVariable("id") Long id, @RequestParam String myParameter, @RequestParam MultipartFile myFile) {
//...
}
看看 RequestMethod.PUT,这在生产版本中不起作用,因为上传文件的 html 标准是 POST。
在我的单元测试中,我这样做:
// setup request
MockMultipartHttpServletRequest multipartRequest = new MockMultipartHttpServletRequest();
MockHttpServletResponse multipartResponse = new MockHttpServletResponse();
// Open file
final FileInputStream fis = new FileInputStream("img/test.png");
MockMultipartFile multipartFile = new MockMultipartFile(
"myParameter", fis);
// generate multipart mock
multipartRequest.addFile(multipartFile);
multipartRequest.addParameter("json", "test");
// send request
handlerAdapter.handle(multipartRequest, multipartResponse, controller);
问题:测试通过了,但它不应该通过。该测试通过的原因有很多。首先,我指定请求。我不是说我有一个请求,而是我不得不说我有一个 MultipartRequest。这会导致调度程序 servlet 在一个名为 isMultipartRequest() 的函数中返回 true。在生产运行中,它返回 false,因为 PUT 方法上没有多部分请求。此外,我再次指定应处理此请求的控制器。
也许还有其他例子,但我想说的是,有没有办法在真实条件下测试我的应用程序,包括我的 html 协议和其他一切?
我真的很感激任何帮助!
提前致谢