[英]How to create own annotation for junit that will skip test if concrete exception was thrown during execution?
我的應用程序有幾種執行模式,在 1 種模式下,我的一些測試會拋出一個具體的異常是正常的。 我需要用@SkipOnFail 之類的東西來注釋這個方法,如果拋出異常,它會將方法設置為跳過。
提前致謝!
@Edit(為了我的問題更清楚)
@Test(expected=ConcreteException.class)
對我不起作用,因為即使沒有拋出 ConcreteException.class 我也需要我的測試通過(如果不拋出此異常,junit 中的預期標記會將我的測試標記為失敗),否則將被跳過。 在所有其他情況下,它應該像往常一樣工作。
@Solution 對我有用(junit v4.7)感謝@axtavt
@Rule
public MethodRule skipRule = new MethodRule() {
public Statement apply(final Statement base, FrameworkMethod method, Object target) {
if(method.getAnnotation(SkipOnFail.class) == null) return base;
return new Statement() {
@Override
public void evaluate() throws Throwable {
try{
base.evaluate();
} catch (ConcreteException e) {
Assume.assumeTrue(false);
}
}
};
}
};
@謝謝
我不認為這樣的功能是開箱即用的,但使用自定義TestRule
和Assume
應該很容易實現,如下所示:
@Rule
public TestRule skipRule = new TestRule() {
public Statement apply(final Statement base, Description desc) {
if (desc.getAnnotation(SkipOnFail.class) == null) return base;
return new Statement() {
public void evaluate() throws Throwable {
try {
base.evaluate();
} catch (MyExceptoion ex) {
Assume.assumeTrue(false);
}
}
};
}
};
使用JUnit 擴展怎么樣?
以下示例取自他們的Tutorial 。
它為先決條件(@Prerequisite)提供了附加注釋:基於條件忽略測試。
所需的方法是在運行測試期間檢查這一點。 所以你可以簡單地添加一個@Prerequisite(requires="")
注釋。
public class TestFillDatabase {
@Prerequisite(requires = "databaseIsAvailable")
@Test public void fillData() {
// ...
}
public boolean databaseIsAvailable() {
boolean isAvailable = ...;
return isAvailable;
}
}
public class TestFillDatabase {
@Prerequisite(requires = "databaseIsAvailable")
@Test public void fillData() {
// ...
}
public boolean databaseIsAvailable() {
boolean isAvailable = ...;
return isAvailable ;
}
}
這個帶有@Prerequisite(requires = "databaseIsAvailable")
指定方法必須是公共方法,返回布爾值或布爾值。
如果這些方法將合並到輔助類中,您還可以使用@Prerequisite(requires = "databaseIsAvailable", callee="DBHelper")
在要調用的類中指定靜態方法。
public class TestFillDatabase {
@Prerequisite(requires = "databaseIsAvailable", callee="DBHelper")
@Test public void fillData() {
// ...
}
}
public class DBHelper {
public static boolean databaseIsAvailable() {
boolean isAvailable = ...;
return isAvailable ;
}
}
同樣使用 Assume 類(自 jUnit 4.4 起),您可以使用AssumeNoException() :
try{
base.evaluate();
} catch (ConcreteException e) {
Assume.assumeNoException("Concrete exception: skipping test", e);
}
我搜索了有關 JUnit 的文檔,似乎從 4.9 版開始,他們引入了他們所謂的測試規則(請參閱TestRule )。 你可以從這里開始。
標記為@Rule
的ExpectedException類可能有助於檢查拋出的異常,但不是測試通過所必需的。
對於更高級的用法,我暫時不能說,因為我剛剛發現它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.