Как заставить JUnit 4.8 запускать код после неудачного теста, но перед любыми методами @After?

Я провожу набор Selenium-тестов (фактически WebDriver-backed Selenium), используя JUnit 4.8.2. Я хотел бы, чтобы тесты автоматически делали скриншот браузера, как только тест не выполнит утверждение. Все тесты наследуются от SeleniumBaseTestCase, а большинство - от SeleniumBastTestCaseWithCompany (который использует методы @Before и @After для создания и последующей очистки общих тестовых данных через Selenium).

Я попробовал добавить подкласс TestWatchman в качестве @Rule в SeleniumBaseTestCase, переопределив метод TestWatchman failed для создания скриншота. Проблема в том, что методы @After, очищающие данные теста, выполняются до вызова метода TestWatchman failed, поэтому все скриншоты относятся к последнему шагу очистки, а не к тесту, который не прошел.

Если немного разобраться, кажется, что метод TestWatchman от apply apply просто вызывает метод evaluate переданного Statement (единственный открытый метод), который вызывает методы @After, не оставляя TestWatchman (или любому другому Правилу) возможности вставить какой-либо код между выполнением теста и методов @After, насколько я могу судить.

Я также видел подходы, в которых создается пользовательский Runner для изменения Statementов, созданных таким образом, что методы, аннотированные пользовательским @AfterFailure, запускаются до @After методов (поэтому скриншот может быть сделан в таком @AfterFailure методе), но это требует переопределения метода BlockJUnit4ClassRunner withAfters, который устарел и должен стать приватным, согласно документации, которая предлагает использовать вместо него Rules.

Я нашел другой ответ на SO о жизненном цикле @Rule, из которого следует, что это просто невозможно в JUnit 4.8, но возможно в JUnit 4.10. Если это так, то это справедливо, просто сначала я хотел бы получить подтверждение этому.

Любые мысли по поводу элегантного и перспективного способа, с помощью которого я могу достичь желаемого, будут очень признательны!

10
задан fap 14 June 2018 в 13:54
поделиться