2015-03-28 2 views
6

У меня есть этот код:Mockito и CDI bean injection, делает @InjectMocks называть @PostConstruct?

class Patient { 

    @Inject Syringe syringe; 

    @PostConstruct 
    void sayThankyouDoc() { 

    System.out.println("That hurt like crazy!"); 

    } 

} 

@RunWith(MockitoJUnitRunner.class) 
class TestCase { 

    @Mock 
    Syringe siringeMock; 

    @InjectMocks 
    Patient patient; 

    //... 

} 

я ожидал Mockito позвонить PostConstruct, но я должен был добавить:

@Before 
public void simulate_post_construct() throws Exception { 
    Method postConstruct = Patient.class.getDeclaredMethod("sayThankyouDoc", null); 
    postConstruct.setAccessible(true); 
    postConstruct.invoke(patient); 
} 

Есть ли лучший способ сделать это?

+1

Другой дизайн, который является более читаемым и легче проверить, чтобы не использовать '@ PostConstruct' на всех, и использовать инъекции конструктора вместо инъекции поля – geoand

+0

@geoand но что _is_ конструктор инъекции? – gurghet

+0

См. Мой ответ ниже – geoand

ответ

5

Хотя я и не отвечу на ваш вопрос, я предлагаю вам отказаться от инъекции в поле и вместо этого использовать инъекцию конструктора (делает код более читаемым и проверяемым).

Ваш код будет выглядеть следующим образом:

class Patient { 

    private final Syringe syringe; 

    @Inject 
    public Patient(Syringe syringe) { 
    System.out.println("That hurt like crazy!"); 
    } 

} 

Тогда ваш тест будет просто:

@RunWith(MockitoJUnitRunner.class) 
class TestCase { 

    @Mock 
    Syringe siringeMock; 

    Patient patient; 

    @Before 
    public void setup() { 
    patient = new Patient(siringeMock); 
    } 

} 

Update

Как было предложено Erik-Karl в комментариях, вы можете использовать @InjectMocks чтобы избавиться от метода установки. Решение работает, потому что Mockito будет использовать соответствующую инъекцию конструктора (как описано here). код будет выглядеть так:

@RunWith(MockitoJUnitRunner.class) 
class TestCase { 

    @Mock 
    Syringe siringeMock; 

    @InjectMocks 
    Patient patient; 

} 
+1

Это ПУТЬ более проверяемый, спасибо вам, доктор! – gurghet

+0

@gurghet Приветствую вас! – geoand

+3

Не только это более проверяемо, но вы получаете некоторые гарантии безопасности потоков, поскольку поля являются окончательными. Обратите внимание, что даже с указанным выше кодом вам нужно вручную вызвать метод '@ PostConstruct' – NamshubWriter

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