4

我正在弃用一些方法和包,为了正确弃用我在 javaDoc(@deprecarted) 中指定并使用注释(@Deprecated) 如下所示:

*/
@Deprecated
@Test(groups = {"domini", "models"})
public class AdrecaTest extends ModelsAbstractTest
{
    /**
     * <pre>
     * @deprecated 
     * Nova ubicació:
     * <b>{@link cat.base.sca.domini.impl.AdrecaTest#comprovarEqualsIncorrecteNul()}</b>
     * </pre>
     * Comprova el mètode equals amb valors incorrectes o nul
     */
    @Deprecated
    @Test **(enabled=false)**
    public void comprovarEqualsIncorrecteNul()
    {
        IAdreca a;

        a = new Adreca();
        a.setTipusAdreca(PT_TIPUS_ADRECA);
        a.setIdEns(PT_ID_ENS);
        a.setIdEmissor(PT_ID_EMISSOR);
        a.setIdVial(PT_ID_VIAL);
        a.setIdSigles(PT_ID_SIGLES);

所以,我需要指定(启用=假)?泰。

4

1 回答 1

6

您可以使用@Ignore注释:

@Deprecated
@Test
@Ignore
public void comprovarEqualsIncorrecteNul()

Junit 会告诉你它已经跳过了一个测试:

测试运行:1,失败:0,错误:0,跳过:1

您还可以在文档标签中添加注释:

@Ignore("Ignoring deprecated test.")

更一般地,您可以使用 a@Rule有条件地跳过类中已弃用的测试方法:

public class SkipDeprecated implements TestRule {

    @Override
    public Statement apply(final Statement stmnt, final Description d) {
        if (d.getAnnotation(Deprecated.class) == null) {
            return stmnt;
        }
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                // Return an empty Statement object for those tests 
                // that shouldn't run.
            }
        };
    }
}

如果没有@Deprecated注释,那么我们像以前一样继续。如果有一个我们返回一个空的Statement,它实际上跳过了测试。

在您的测试类中,您需要声明规则:

@Rule
public final SkipDeprecated sd = new SkipDeprecated();

取自Mike Reedell的示例并稍作修改。

正如 Mike 指出的那样,这并不完美,因为测试被标记为通过。我做了更多的谷歌搜索,发现了这个,它很旧,但很好地总结了在规则中跳过测试的问题。

编辑

经过一些实验,以下似乎与 JUnit 4.11 配合得很好

public class SkipDeprecated implements TestRule {

    @Override
    public Statement apply(final Statement stmnt, final Description d) {
        if (d.getAnnotation(Deprecated.class) == null) {
            return stmnt;
        }
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                throw new AssumptionViolatedException("Test is deprecated.");
            }
        };
    }
}

这利用了 JUnit 的API 并从用于测试的 API 中Assume抛出一个。这会导致 JUnit 认为该测试在这些情况下不适用,并将其报告为已跳过 - 这比在无操作情况下报告为已通过更可取。AssumptionViolatedExceptionStatement@Deprecated

于 2013-11-07T08:42:26.340 回答