В тесте JUnit с JMockit я использую аннотацию @Injectable
для инициализации полей, которые находятся в производственном коде, инициализированном с помощью Spring DI.Почему приложение @Injectable JMockit не применяется ко всем соответствующим полям?
Я использую реализацию типа в нескольких классах. Почему нет C
в качестве реализации IC
, введенного в макет типа A
, как он вводится в типы B
и D
в нижеуказанном методе испытаний?
@Service
@Scope("prototype")
public class A {
@Autowired IC c;
public IC getC() { return c; }
// do something using C in the method body
public void doSomething() {}
}
@Service
@Scope("prototype")
public class B {
@Autowired IC c;
public IC getC() { return c; }
// do something using C in the method body
public void doSomething() {}
}
public interface IC { void doSomething(); }
@Service
@Scope("prototype")
public class C implements IC {
@Override
public void doSomething() {}
}
@Service
public class D {
@Autowired IC c;
@Autowired B b;
@Autowired A a;
public IC getC() { return c; }
public B getB() { return b; }
public A getA() { return a; }
}
public class TestClass {
@Tested(fullyInitialized = true) D d;
@Injectable IC c;
@Tested @Injectable A a;
@Tested @Injectable B b;
@Test
public void test() {
// expectations are recorded here
assertNotNull(d.getC());
assertNotNull(d.getB().getC());
// Null reference
assertNotNull(d.getA().getC());
}
}
Edit: @Tested
и случаи использования C
были добавлены в примере кода. Аннотации были использованы для ввода C
в A
и B
, чтобы окончательно использовать его в некоторых своих методах.
Edit 2: ли разрешено использовать @Tested
этот путь для более чем одного поля в тестовом классе продлить блок, который тестируется?
Я не получаю никакой нулевой ссылки в этом тесте. 'D' получает экземпляр со всеми тремя полями' a', 'b' и' c', заданными из соответствующих полей '@ Injectable' в тестовом классе. Обратите внимание, что использование 'fullInitialized = true' не имеет эффекта в этом случае, поскольку все поля в классе' @ Tested' имеют соответствие '@ Injectable'. –
@ Rogério: Спасибо за отзыв. Ты прав. Однако я добавил недостающие части кода, чтобы дать вам полную картину тестового примера, чтобы вы могли проверить, почему он терпит неудачу. –