我擴展了dsaff的答案,以解決TestRule
無法在測試方法執行和後續方法執行之間執行某些代碼的問題。因此,使用簡單的MethodRule
,不能使用此規則提供在@After
帶註釋的方法中使用的成功標誌。
我的想法是黑客!無論如何,這是使用TestRule
(延伸TestWatcher
)。 A TestRule
將獲得有關測試失敗或成功的知識。然後,我的TestRule
將掃描該類中所有用我的新AfterHack
批註註釋的方法,並使用成功標誌調用該方法。
AfterHack
註釋
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(RUNTIME)
@Target(METHOD)
public @interface AfterHack {}
AfterHackRule
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class AfterHackRule extends TestWatcher {
private Object testClassInstance;
public AfterHackRule(final Object testClassInstance) {
this.testClassInstance = testClassInstance;
}
protected void succeeded(Description description) {
invokeAfterHackMethods(true);
}
protected void failed(Throwable e, Description description) {
invokeAfterHackMethods(false);
}
public void invokeAfterHackMethods(boolean successFlag) {
for (Method afterHackMethod :
this.getAfterHackMethods(this.testClassInstance.getClass())) {
try {
afterHackMethod.invoke(this.testClassInstance, successFlag);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
throw new RuntimeException("error while invoking afterHackMethod "
+ afterHackMethod);
}
}
}
private List<Method> getAfterHackMethods(Class<?> testClass) {
List<Method> results = new ArrayList<>();
for (Method method : testClass.getMethods()) {
if (method.isAnnotationPresent(AfterHack.class)) {
results.add(method);
}
}
return results;
}
}
用法:
public class DemoTest {
@Rule
public AfterHackRule afterHackRule = new AfterHackRule(this);
@AfterHack
public void after(boolean success) {
System.out.println("afterHack:" + success);
}
@Test
public void demofails() {
Assert.fail();
}
@Test
public void demoSucceeds() {}
}
順便說一句:
- 1)希望有在Junit5
更好的解決方案
- 2)更好的方法是在所有使用規則TestWatcher代替@Before和@After方法的(即我讀dsaff的答案的方式)
@see
是不是你的'@ Before'方法以確保環境設置正確的每一個測試護理? –
@Vineet Reynolds:是和否:我正在使用Selemium2/Webdriver進行測試,我想重新使用驅動程序。但是如果之前的測試沒有任何錯誤,我只想重用。 – Ralph
好的,我目前的問題。我試圖避免國旗。希望看到其他答案。如果我遇到一個合理的解決方案,我會發布我的。 –