用于测试自定义异常的Spring Boot JUnit测试用例将抛出AssertionError而不是CustomException

时间:2018-10-01 15:23:39

标签: spring spring-boot junit custom-exceptions

我正在测试一个采用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());
    }
  }
}

1 个答案:

答案 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
}

它被称为默认构造函数,因为它会自动存在。