Ответы пользователя по тегу JUnit
  • Как протестировать сервлет?

    @ads83
    Проблема в том, что твой сервлет создает каждый раз новый dbManager. Ему пофигу, что ты там мокаешь - он создает. каждый вызов. new DBManagerService()
    Это ужас-ужас и за такое бьют линейкой по пальцам в реальном коде недопустимо

    Стандартное решение - создать поле в классе и использовать code injection, т.е. прописать аннотацию @Autowired:
    public class ConformPay extends HttpServlet {
      private static final Logger LOGGER = Logger.getLogger(ConformPay.class);
      private static final long serialVersionUID = 1L;
    
    @Autowired
    DBManager dbManager


    Потом тебе надо указать Спрингу (или аналогу), где взять компонент DBManager.
    В тесте ты указываешь, что вместо настоящего DBManager нужно использовать mock.
    ----
    Другой вариант, менее трудоемкий, но и менее распространенный - это использовать мок на геттере. Так же создаешь в сервлете поле, создаешь/инжектируешь его в конструкторе и создаешь методDBManager getDBManager() {return dBManager);}. Потом в методе `doPost` обращаешься не к полю dBManager, а дергаешь геттер: getDBManager().delPayment(dtime);
    В тесте же на своем сервлете ставишь заглушку на этот метод:
    when(conformPay.getDBManager()).thenReturn(dbManagerMock)

    Проблема в этом подходе в том, что тебе нужно не создавать заглушку для conformPay, а использовать настоящий класс с заглушкой. Почитай про метод spy(), а также почему его рекомендуют применять только в исключительных случаях.
    Ответ написан
    Комментировать