在方法内设置自定义注释?

时间:2016-02-25 00:03:39

标签: java unit-testing annotations

我开发简单的单元测试库,只是为了娱乐和体验。只要我编写单元测试,我就会遵循给定时间或安排动作断言模式。所以我想,不要把这个模式名称写成测试方法体中的单行注释:

@TestClass(enabled = false)
public class DemonstrationTest {

    @UnitTest
    public void StringBuilderSuccess() throws AssertFailureException{
        //Given
        String firstTitle = "CosmicWhale";
        String secondTitle = "AmbientTurtle";
        StringBuilder stringBuilder = new StringBuilder();
        String expected = firstTitle + " " + secondTitle;

        //When
        String actual = stringBuilder.append(firstTitle).append(" ").append(secondTitle).toString();

        //Then
        btester.framework.Assert.assertEquals(expected, actual);
    }
}

我可以创建注释,以遵循这种模式。这更优雅:

@UnitTest
    public void StringBuilderSuccess() throws AssertFailureException{
        @Given
        String firstTitle = "CosmicWhale";
        String secondTitle = "AmbientTurtle";
        StringBuilder stringBuilder = new StringBuilder();
        String expected = firstTitle + " " + secondTitle;

        @When
        String actual = stringBuilder.append(firstTitle).append(" ").append(secondTitle).toString();

        @Then
        String localVariable;
        btester.framework.Assert.assertEquals(expected, actual);
    }

我的问题是,这些注释中的每一个都必须高于某个局部变量。这对@Given和@When注释来说不是问题,但是对于最后的@Then注释来说这是个大问题。我在@Then注释下创建了冗余局部变量,以绕过问题。

问题:是否有机会在代码中的Assert上面放置注释?

每个注释体看起来都是lika:

@Retention(RetentionPolicy.CLASS)
@Target(ElementType.LOCAL_VARIABLE)
public @interface When {

}

我正在使用Java 8。 我将不胜感激任何帮助。

聚苯乙烯。如果您想检查或贡献我的项目,可以找到它here

2 个答案:

答案 0 :(得分:4)

Java 8不允许在语句上编写注释。 它被认为是,但不包括在Java 8中。

这是一些背景知识。

Java 5+允许在声明上编写注释。 Java 8+允许在类型上编写注释。

用于在类型上编写注释的Java 8功能的代码名称为"JSR 308"。 Java 8对Java注释进行了一些其他扩展,例如允许重复注释,以及在类文件中表示局部变量的声明注释。 JSR 308还考虑了其​​他extensions to annotations,包括annotations on statements。虽然语句上的注释有多个use cases,但最后是JSR 308,因此是Java 8,did not include注释语句功能。

答案 1 :(得分:1)

据我所知:只有在声明方法时才能将注释应用于方法,而不是在被调用时。

我没有看到任何明确使用上述代码的注释。但是,如果你真的想要注释

使用返回非void数据类型的方法包装断言语句。 (可能布尔?)

在上面的实现中,注释将应用于方法的返回值。 (您可以选择使用变量名称存储它)