Ответ 1
Из-за того, что правила настроены, вы не можете иметь правило, которое появляется после @раньше или до @после. Вы можете думать о правилах, таких как оболочки, которые вы накладываете на метод тестирования. Первая оболочка для продолжения - @перед/@после. После этого применяются @rules.
Быстрый способ сделать то, что вы хотите сделать, это избегать @После всех вместе. Правило может быть создано таким образом, чтобы он выполнял скриншот, если метод завершился неудачей, а затем выполните ваш код. Это не так красиво, как @After, но это работает. (также я внедрил TestRule, потому что MethodRule был обесценен).
public class MorgatgeCalculatorTest {
@Before
public void before(){
System.out.println("I am before");
}
@BeforeClass
public static void beforeclass(){
System.out.println("I am beforeclass");
}
@Test
public void test(){
System.out.println("I am a Test");
}
@Test
public void test2(){
System.out.println("I am a Failed Test");
fail();
}
@AfterClass
public static void afterclass(){
System.out.println("I am afterclass");
}
@Rule
public ExpensiveExternalResource ExpensiveExternalResource = new ExpensiveExternalResource();
public static class ExpensiveExternalResource implements TestRule {
// public ExpensiveExternalResource(){}
public class ExpansiveExternalResourceStatement extends Statement{
private Statement baseStatement;
public ExpansiveExternalResourceStatement(Statement b){
baseStatement = b;
}
@Override
public void evaluate() throws Throwable {
try{
baseStatement.evaluate();
}catch(Error e){
System.out.println("I take a Screenshot");
throw e;
}finally{
after();
}
}
//Put your after code in this method!
public void after(){
System.out.println("I am after");
}
}
public Statement apply(Statement base, Description description) {
return new ExpansiveExternalResourceStatement(base);
}
}
}
Вся работа правила выполняется в инструкции. Org.junit.runners.model.Statement - это класс, представляющий собой набор кода. Таким образом, здесь метод apply получает пакет кода, в который вы помещаете оболочку. Apply возвращает ваш оператор, который выполняет комплект кода, который вы ему дали, и окружает его с помощью инструкции try/catch, чтобы поймать ошибки метода.
Выход для этого метода:
I am beforeclass
I am before
I am a Test
I am after
I am before
I am a Failed Test
I take a Screenshot
I am after
I am afterclass
Надеюсь, это поможет!