2015-05-12 1 views
10

я реализовал JUnit 4TestRule (расширяет ExternalResource), и ввожу его в качестве @ClassRule в моем тестовом классе: Я хочу, чтобы инициализировать ресурс один раз для всех в каждом испытании этого класса и в конечном итоге сорвать его.метод @Before в TestRule не называется

Моя проблема заключается в том, что мои @Before и @After правило-методы не вызываются вовсе до/после моего @Test метода: любая идея, почему это происходит?

Minimal компилируемый пример:

package com.acme.test; 

import static org.junit.Assert.assertNull; 
import org.junit.ClassRule; 
import org.junit.Test; 
import org.junit.rules.ExternalResource; 

class Coffee { 
    public void throwAway() {} 
} 

class CoffeeMachine extends ExternalResource { 
    Coffee whatElse;  
    @Override protected void before() throws Throwable { 
     whatElse = new Coffee(); 
    } 

    @Override protected void after() { 
     whatElse.throwAway(); 
    } 

    public Coffee gimmieCoffee() { return whatElse; } 
} 

public class CoffeeTester { 
    @ClassRule public static CoffeeMachine CM = new CoffeeMachine(); 

    @Test public void drinkACoffee() { 
     Coffee c = CM.gimmieCoffee(); 
     assertNull(c); // ---> Coffee is null!!      (fuuuuuuuuuu...) 
    } 
} 

Есть ли что-то я недопонимание? Обратите внимание, что то же самое происходит и с нестационарным @Rule.

Я использую JUnit 4.11.

Большое спасибо за любой намек.

+0

должен не '@ Before' быть в том же классе, как' @Test '? Я также не уверен, что если переопределить 'before()' будет достаточно, если он также не будет помечен – Dragondraikk

+0

Не так ... но спасибо Dragondraikk. – Campa

+0

Вы явно не пробовали код, который вы предоставили, потому что у вас слишком много 'm' в вызове 'gimmieCoffee' - и нет импорта. Я исправил эти вещи, и все в порядке. Просьба привести пример, который компилирует и фактически демонстрирует проблему. –

ответ

3

Я не вижу здесь проблемы, а просто недоразумение. Прежде всего, давайте прочитаем assert как it must be и изменить свой код немного (это очевидно, ваш тест говорит c must not be null, который дает нам:. assertNotNull(c);

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

package com.acme.test; 

import static org.junit.Assert.assertNotNull; 
import org.junit.ClassRule; 
import org.junit.Test; 
import org.junit.rules.ExternalResource; 

class Coffee { 
    public void throwAway() {} 
} 

class CoffeeMachine extends ExternalResource { 
    Coffee whatElse;  
    @Override protected void before() throws Throwable { 
     whatElse = new Coffee(); 
     System.out.println(" ### executing before: " + whatElse); 
    } 

    @Override protected void after() { 
     whatElse.throwAway(); 
    } 

    public Coffee gimmieCoffee() { return whatElse; } 
} 

public class CoffeeTester { 
    @ClassRule public static CoffeeMachine CM = new CoffeeMachine(); 

    @Test public void drinkACoffee() { 
     Coffee c = CM.gimmieCoffee(); 
     System.out.println(" ### executing test: " + c); 
     assertNotNull(c); 
    } 
} 

для меня это дает следующее:.

### executing before: [email protected] 
[VerboseTestNG] INVOKING: "com.acme.test.CoffeeTester" - com.acme.test.CoffeeTester.drinkACoffee() 
### executing test: [email protected] 
[VerboseTestNG] PASSED: "com.acme.test.CoffeeTester" - com.acme.test.CoffeeTester.drinkACoffee() finished in 4 ms 
[VerboseTestNG] 
[VerboseTestNG] =============================================== 
[VerboseTestNG]  com.acme.test.CoffeeTester 
[VerboseTestNG]  Tests run: 1, Failures: 0, Skips: 0 
[VerboseTestNG] =============================================== 

так c не равно нуль, как вы ожидаете, что это будет

.
+0

спасибо вам за помощь! Однако я получаю '### executeing test: null'. :) – Campa

+0

Это действительно захватывающе :) Вы попробовали другую версию JUnit? Можете ли вы предоставить контрольную сумму банки, которую у вас есть? –

+0

Я использую JUnit, который поставляется с Eclipse: 'org.junit_4.11.0.v201303080030 /'. Контрольная сумма в порядке. Я попробовал теперь с 4.12, мой первоначальный пример отлично работает. – Campa

4

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

Проверьте конфигурацию запуска для теста и убедитесь, что используется стандартный JUnit 4 тест бегун:

enter image description here

+0

Эй, спасибо за это, но я проверил его уже: все нормально. – Campa

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

  • Нет связанных вопросов^_^