簡體   English   中英

如何為junit創建自己的注釋,如果在執行期間拋出具體異常,它將跳過測試?

[英]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);
                }
            }
        };
    }
};

@謝謝

我不認為這樣的功能是開箱即用的,但使用自定義TestRuleAssume應該很容易實現,如下所示:

@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 )。 你可以從這里開始。

標記為@RuleExpectedException類可能有助於檢查拋出的異常,但不是測試通過所必需的。

對於更高級的用法,我暫時不能說,因為我剛剛發現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM