Долбаные тесты для Spring, код ошибки 406 Not Acceptable

· На чтение уйдёт 2 минуты · (245 слов)

Сегодня случилась жуткая и непонятная фигня. Взяли и сломались тесты. На ровном, казалось бы, месте: немножко поменялся ответ одного из основных контроллеров. Хотя, конечно, стоило немалых трудов при подобного масштаба рефакторинге обойтись столь малыми изменениями. Выдаёт assertion failed на строчке, которая проверяет статус HTTP-ответа. Код ­— 406, указывает на несовместимость Accept. Забавно, с учётом того, что Accept: */*, по умолчанию.

И вот, лезешь ты такой на StackOverflow, в надежде найти ответ. Но там советуют конфигурировать тесты через .xml (здравствуй, Spring 2.0 из прошлого десятилетия). Другой вариант — советуют поставить дополнительные библиотеки из Jackson (ещё пока он был в CodeHaus). В общем, чего только не советуют, но всё не помогает (да и не должно). Ларчик открывался просто — на самом деле в одном из бинов, возвращаемых из Spring MVC, не было ни одного public геттера. Спасибо безвестному чуваку, который сказал "отвалите от спринга, ищите ошибку у себя в бинах".

Разобравшись, в чём дело, имеем, что на самом деле ситуация очень неоднозначная: Jackson выкидывает для этого бина эксепшен. Spring MVC этот эксепшен пожирает, и возвращает ошибку 206. Мне кажется, что проблема в плохом взаимодействии библиотек. Например, Spring мог бы вернуть 500 ошибку, как это делается в случае других эксепшенов. Мог бы даже вернуть 206, но написать в лог warning. Или Jackson мог бы вернуть пустой XML. Но нет, что-то не срослось и возникла вот такая ошибка.

В общем, если вдруг возникает HTTP ошибка 406 — не спешите лезть в настройки Produces и Accept, поищите ошибку в бине.

Полезное