我正在测试一个采用MultipartFile作为输入的Spring boot MVC应用程序。当文件格式不是.json时,我的服务类将引发自定义异常。我已经编写了一个JUnit测试用例来测试这种情况。
我的测试用例不是引发我的自定义异常(expected = FileStorageException.class)
,而是引发了AssertionError
。
如何解决此问题并使用.andExpect(content().string("Wrong file format. Allowed: JSON."))
例外
09:36:48.327 [main]调试org.springframework.test.web.servlet.TestDispatcherServlet-无法完成请求 com.test.util.exception.FileStorageException:错误的文件格式。允许:JSON。
代码
@WebAppConfiguration
@ContextConfiguration(classes = WebConfig.class, initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class UploadTest
{
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setup()
{
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
/**
*
*/
public UploadTest()
{
// default constructor
}
@Test(expected = FileStorageException.class)
// @Test(expected= AssertionError.class)
public void testInvalidFileFormat() throws Exception
{
try
{
MockMultipartFile testInput = new MockMultipartFile("file", "filename.txt", "text/plain", "some json".getBytes());
mockMvc.perform(MockMvcRequestBuilders.multipart("/uploadFile").file(testInput))
// .andExpect(status().isInternalServerError()).andExpect(content().string("Wrong
// file format. Allowed: JSON."))
.andDo(print());
}
catch (Exception e)
{
fail(e.toString());
}
}
}
答案 0 :(得分:0)
JUnit仅知道测试方法引发的异常(在您的示例testInvalidFileFormat()
中。因此,它只能检查这些异常。
您正在捕获mockMvc.perform(...)
引发的每个异常,而是从行中抛出AssertionError
fail(e.toString());
这是您在测试结果中看到的AssertionError
。
如果您要测试异常,则不得在测试中捕获异常:
@Test(expected = FileStorageException.class)
public void testInvalidFileFormat() throws Exception
{
MockMultipartFile testInput = new MockMultipartFile(
"file", "filename.txt", "text/plain", "some json".getBytes()
);
mockMvc.perform(MockMvcRequestBuilders.multipart("/uploadFile").file(testInput))
// .andExpect(status().isInternalServerError()).andExpect(content().string("Wrong
// file format. Allowed: JSON."))
.andDo(print());
}
通过这种方式,您无需显式添加默认构造函数即可删除行
/**
*
*/
public UploadTest()
{
// default constructor
}
它被称为默认构造函数,因为它会自动存在。