Есть три причины:
Это делает контроллер меньше -> проще для понимания и обслуживания
Это облегчает тестирование логики.
Вы действительно не хотите управлять своими транзакциями вручную.
Если вы поместите все в контроллер, вам нужно будет создать среду выполнения Web, чтобы можно было выполнить любой тест. Если ваша логика находится за пределами, вы можете скопировать необходимые данные из HTTP-запроса и всех других источников и просто вызвать код. Таким образом, логика не зависит от сеансов HTTP, запросов или чего-либо еще, что вы не хотите.
Например, для тестирования JSP вам нужен HTTPRequest. Для запроса вам нужен HTTPSession и JSPWriter. Те нуждаются в контексте сеанса. Так что, чтобы иметь возможность запустить один тест, вам нужно настроить и инициализировать целую группу классов. И все это интерфейсы и реализации являются частными. Таким образом, вы должны реализовать реальные методы (все 300 из них) самостоятельно. И вам лучше понять это правильно, иначе ваши тесты не будут проверять то, что вы хотите.