Я должен не соглашаться со статьей о характере применяемых методов тестирования. Решение использует затвор, чтобы проверить, будет ли тест успешным или неудачным на промежуточной стадии.
На мой взгляд, лучше использовать Guard Assertions, особенно для таких испытаний (при условии, что тест не окажется длинным и сложным, что само по себе является анти-шаблоном). Использование охранных утверждений заставляет вас спроектировать SUT одним из следующих способов:
- Разработать сам метод, чтобы предоставить достаточную информацию в результате того, прошел или не удалось выполнить вызов. Иногда это невозможно сделать, поскольку намерение дизайнера не должно возвращать результат и вместо этого вызывать исключение (это может быть рассмотрено во втором случае).
- спроектируйте SUT так, чтобы это было state can be verified после каждого значимого вызова метода.
Но прежде, чем мы рассмотрим выше возможности, посмотрите на следующий фрагмент снова:
plane.bookAllSeats();
plane.bookPlane(createValidItinerary(), null);
Если намерение состоит в том, чтобы проверить bookPlane() и проверить, для выполнения этого метода, он лучше иметь bookAllSeats() в приспособлении. В моем понимании, вызов bookAllSeats() эквивалентен настройке SUT, чтобы гарантировать, что вызов функции bookPlane() не удался, и, следовательно, наличие приспособления для этого будет делать для более читаемого теста. Если намерение отличается, я бы рекомендовал тестировать состояние после каждого перехода (как я обычно делал бы в функциональных тестах), чтобы помочь определить первопричину сбоя.
Когда я впервые увидел это, мне показалось неудобным. Теперь, когда я экспериментировал, кажется, что он действительно должен работать для того, что я пытаюсь сделать. –
TestNG хвастается, что не нужно это делать. – djechlin