2013-04-11 5 views
1

Попытка создания некоторых вариантов создания правил в файле groovy, я пришел к мысли, что @Rule не описывает ДЕКЛАРАЦИЮ, а ASSIGNMENT. Итак, бегун, загружая тест, старается каждое правило для правильного назначения.Какова логика объявления и присвоения @Rule (JUnit) в классе Groovy

//Correct variants: 
@Rule 
public ErrorCollector collector1= new ErrorCollector(); 

public ErrorCollector collector2= null; 
@Rule 
collector2= new ErrorCollector(); 

public ErrorCollector collector3; 
@Rule 
collector3= new ErrorCollector(); 


// incorrect variants: 
@Rule 
public ErrorCollector collector4= null; 

@Rule 
public ErrorCollector collector5; 

@Rule 
public ErrorCollector collector5=somethingThatIsNotRule; 

@Rule 
public ErrorCollector collector5=anotherRule; 

Но, тогда я пришел к некоторым paradoxial вариантов:

//these lines are not only taken by the runner, but also passed without errors: 
public ErrorCollector collector6; 
{ 
    @Rule 
    collector6= null; 
} 

public ErrorCollector collector7=null; 
{ 
    @Rule 
    collector7= null; 
} 

Какова логика этого?

Кажется, что ошибка в Runner - бегун делает чрезмерную проверку перед конструированием теста.

+0

Невозможно, если вы посмотрите на аннотацию '@ Rule', у нее есть цели' FILED' & 'METHOD'. Ваш парадоксальный вариант не должен компилироваться, потому что по существу это полевое назначение внутри блока инициализатора экземпляра, а не объявление поля. –

+0

ну, я могу только предположить, что есть ошибка в компиляторе Eclipse. Этот фрагмент кода не компилируется в IntelliJ Idea –

+0

Да, извините, я забыл упомянуть, что все это сделано в groovy file - groovy не так строг, как java - отредактирован. – Gangnus

ответ

1

В Java, как JUnit бегун проверяет, что @Rule аннотации применяется к общественному нестатическому полю или общественному не-статическому методу, который возвращает либо TestRule или MethodRule.

Если есть примечание о поле или методе , то значение должно быть непустым значением или вы получите исключение NullPointerException во время выполнения теста.

Ваш пример более сложный, потому что Groovy является динамическим языком, поэтому он проверяет его во время выполнения, а не на время компиляции. Я подозреваю, что collector2 и collector3 на самом деле ничего не делают. Аннотации @Rule не относятся к полю.

collector4 => NullPointerException 
collector5 => same as collector5 
collector5a => when you execute, I suspect Groovy doesn't find the 
       expected methods on your somethingThatIsNotRule, or 
       you're getting a ClassCastException or something similar. 
collector5b => same as 5b for anotherRule 

Для ваших парадоксов, опять же, @Rule аннотацию не на самом деле применения в полевых условиях.

Я подозреваю, что ваше замешательство происходит из-за того, что Groovy не жалуется на использование @Rule на том, что не является полем или методом (тогда как Java будет). Он может не жаловаться, но JUnit игнорирует такую ​​аннотацию.

+0

Я уже это заметил. Да, для коллекционеров 6 и 7 коллекторы в {} новы. BTW, в моем коде Groovy ErrorCollector работает нормально в статическом поле. И все же у меня будет еще один вопрос: http://stackoverflow.com/questions/15966146/why-does-errorcollector-demands-for-assignment-at-moment-of-declaration. И, пожалуйста, вы можете проверить тег def: http://stackoverflow.com/edit-tag-wiki/90826. Спасибо. – Gangnus

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