Тестовый пример Spring Boot JUnit для проверки настраиваемого исключения выдает AssertionError вместо CustomException

Я тестирую приложение Spring boot MVC, которое принимает в качестве входных данных MultipartFile. Мой класс обслуживания вызовет настраиваемое исключение, если формат файла отличается от .json. Я написал тестовый пример JUnit, который проверяет этот сценарий.

Вместо того, чтобы генерировать мое пользовательское исключение (expected = FileStorageException.class), мой тестовый пример выбрасывает AssertionError.

Как решить эту проблему и проверить сообщение об исключении с помощью .andExpect(content().string("Wrong file format. Allowed: JSON."))

Исключение

09: 36: 48.327 [main] DEBUG 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
2 282
1

Ответы 1

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
}

Он называется конструктором по умолчанию, потому что он там автоматически.

Другие вопросы по теме