【发布时间】:2015-08-30 05:39:47
【问题描述】:
我正在使用 Spring Boot 1.2.5-RELEASE。我有一个接收MultipartFile 和String 的控制器
@RestController
@RequestMapping("file-upload")
public class MyRESTController {
@Autowired
private AService aService;
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public void fileUpload(
@RequestParam(value = "file", required = true) final MultipartFile file,
@RequestParam(value = "something", required = true) final String something) {
aService.doSomethingOnDBWith(file, value);
}
}
现在,服务运行良好。我用 PostMan 对其进行了测试,一切都按预期进行。 不幸的是,我无法为该代码编写独立的单元测试。当前的单元测试是:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyApplication.class)
@WebAppConfiguration
public class ControllerTest{
MockMvc mockMvc;
@Mock
AService aService;
@InjectMocks
MyRESTController controller;
@Before public void setUp(){
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
}
@Test
public void testFileUpload() throws Exception{
final File file = getFileFromResource(fileName);
//File is correctly loaded
final MockMultipartFile multipartFile = new MockMultipartFile("aMultiPartFile.txt", new FileInputStream(file));
doNothing().when(aService).doSomethingOnDBWith(any(MultipartFile.class), any(String.class));
mockMvc.perform(
post("/file-upload")
.requestAttr("file", multipartFile.getBytes())
.requestAttr("something", ":(")
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE))
.andExpect(status().isCreated());
}
}
测试失败
java.lang.IllegalArgumentException: Expected MultipartHttpServletRequest: is a MultipartResolver configured?
现在,在 Spring Boot 的 MultipartAutoConfiguration 类中,我看到 MultipartResolver 是自动配置的。但是,我想使用MockMvcBuilders 的standaloneSetup 我无法访问它。
我尝试了几种单元测试配置,为简洁起见,我没有报告。特别是,我还尝试了如图所示的放心 here,但老实说这不起作用,因为我似乎无法模拟 AService 实例。
有什么办法吗?
【问题讨论】:
标签: java spring unit-testing spring-mvc multipartform-data