Я тестирую приложение 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());
}
}
}
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
}
Он называется конструктором по умолчанию, потому что он там автоматически.