О насмешливых рамках

Я использую powermock и с этим у меня есть несколько вопросов.

  1. Нужно ли нам модифицировать наш код в случае, если мы обнаружим (на более позднем этапе), что он не тестируется с powermock или же mockito или любой другой фреймворк для тестирования? то есть, если мы прекратим писать статические / приватные методы, некоторые фреймворки не смогут это проверить (я знаю, powermock имеет возможность для тестирования этих методов)

  2. При издевательстве / слежке за объектом должен вызываться реальный метод? т.е. я проверяю это, сохраняя точку отладки в вызове метода, должно ли выполнение перейти к точке отладки?

Пожалуйста, помогите мне в понимании этих вещей.

2 ответа

1.) Не тестируемый / плохо тестируемый код - это в основном признак плохого дизайна, так что да, вы должны изменить свой код. Массивные статические методы / состояния - это запах кода, который означает плохой дизайн и, в конечном итоге, приводит к увеличению усилий по обслуживанию. Частные методы, как правило, должны быть проверены в их публичных вызывающих, потому что они просто помощники. По моему мнению, частные методы никогда не должны тестироваться напрямую, потому что они могут измениться в любое время посредством рефакторинга, так как открытый интерфейс вашего класса должен быть своего рода стабильным.

2.) Когда вы имитируете, целевой метод / объект не должен вызываться. Во время шпионажа следует вызывать шпионский метод / объект

Меня привели в команду, у которой была гигантская устаревшая система, но они добавляли в нее новый класс / методы. Эти классы и методы будут касаться до 10 DAO/DAL. Однако эти DAO / DAL работали более 20 лет и имели очень мало сбоев. Поэтому их поведение было ожидаемым. Использование mock в этом случае сработало очень хорошо, я мог написать чисто модульные тесты для нового кода и смоделировать все DAO для возврата объектов / или исключений для проверки наших граничных сценариев.

Mocks отлично подходят для тех случаев, когда вам нужен доступ к базам данных, соединение через Интернет или особенно большой класс, экземпляр которого вы не хотите вызывать, чтобы вызывать только один метод. Если у вас есть класс, который требует много объектов в своем конструкторе (каждый из которых должен быть создан), но на самом деле вам просто нужно получить Class.CanRetry() (который будет возвращать либо true, либо false), mock прекрасно работает в этот экземпляр.

Молоток - отличный инструмент, но он не поможет вам прочистить унитаз... по крайней мере, хорошо. Моты - отличный инструмент, чтобы знать, как их использовать, но для них есть время и место.

Пожалуйста, обратитесь к этим двум замечательным статьям для получения дополнительной информации о том, как / когда использовать макеты:

Когда издеваться

Мок не тупики (немного длиннее, но полезная информация)

Что касается вашего второго вопроса, эта следующая статья даст вам лучшее понимание различий между всеми различными типами "тестовых двойников", которые включают фиктивные объекты, тестовые шпионы, фиктивные объекты и т. Д. Agile Engineering: Test Doubles

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