2015-04-03 5 views
1

В тесте 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 этот путь для более чем одного поля в тестовом классе продлить блок, который тестируется?

+0

Я не получаю никакой нулевой ссылки в этом тесте. 'D' получает экземпляр со всеми тремя полями' a', 'b' и' c', заданными из соответствующих полей '@ Injectable' в тестовом классе. Обратите внимание, что использование 'fullInitialized = true' не имеет эффекта в этом случае, поскольку все поля в классе' @ Tested' имеют соответствие '@ Injectable'. –

+0

@ Rogério: Спасибо за отзыв. Ты прав. Однако я добавил недостающие части кода, чтобы дать вам полную картину тестового примера, чтобы вы могли проверить, почему он терпит неудачу. –

ответ

0

Эта функция исправлена ​​в jmockit 1.25. Убедитесь, что вы используете последнюю версию.

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