2016-02-25 2 views
0

Я разрабатываю простую библиотеку единичных тестов, просто для удовольствия и опыта. Пока я пишу модульные тесты, я следую шаблону, заданному-когда-то или упорядочиваю-действовать-утверждать. Поэтому я подумал, что вместо того, чтобы написать этот паттерн имена в одной строке комментарии в методе пробного тела:Установить пользовательские аннотации внутри метода?

@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 и @ При аннотации, но это большая проблема с последней аннотацией @Then. Я создал redundand локальную переменную под аннотацией @Then, чтобы обойти проблему.

Вопрос: Есть ли вероятность разместить аннотацию выше? Закрепить в коде?

Каждое тело аннотацию выглядит Лика это:

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

} 

Я использую Java 8. буду благодарен за любую помощь.

Ps. Если вы хотите проверить или внести свой вклад в мой проект, вы можете найти его here.

ответ

4

Java 8 не позволяет записывать аннотации в операторах. Рассматривалось, но не включено в Java 8.

Вот некоторые фон.

Java 5+ позволяет записывать аннотации в объявлениях. Java 8+ позволяет писать аннотации по типам.

Функция Java 8 для написания аннотаций по типам была известна по ее кодовому названию "JSR 308". Java 8 сделала некоторые другие расширения для аннотаций Java, таких как разрешение дублирующих аннотаций и представление аннотаций объявления для локальных переменных в файле классов. JSR 308 также рассмотрел другие extensions to annotations, включая . Хотя аннотации к операторам имеют число use cases, в конце JSR 308 и, следовательно, Java 8, did not include функция аннотаций по заявкам.

+0

Благодарим вас за ответ. –

1

Насколько я знаю: аннотация может применяться к методам только тогда, когда они объявляются, а не при вызове.

Я не вижу ясного использования аннотаций для вышеуказанного кода. но, если вы действительно хотите просто добавить аннотации

оберните утверждение с помощью метода, который возвращает непустой тип данных. (возможно, boolean?)

В приведенной выше реализации аннотация будет применена для возврата значения метода. (вы можете сохранить его с именем переменной)

+0

Да, я думал об этом, но даже если метод Assert возвращает логическое значение, я должен поймать его в некоторой локальной переменной. Думаю, никто (даже мне) не захочет создать локальную переменную в методе Assert только для цели @Then. Но спасибо за ваш ответ. Я подумаю о другом решении этой проблемы. –

Смежные вопросы