я реализовал 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.
Большое спасибо за любой намек.
должен не '@ Before' быть в том же классе, как' @Test '? Я также не уверен, что если переопределить 'before()' будет достаточно, если он также не будет помечен – Dragondraikk
Не так ... но спасибо Dragondraikk. – Campa
Вы явно не пробовали код, который вы предоставили, потому что у вас слишком много 'm' в вызове 'gimmieCoffee' - и нет импорта. Я исправил эти вещи, и все в порядке. Просьба привести пример, который компилирует и фактически демонстрирует проблему. –