2015-03-28 12 views
6

mam ten kod:Wstrzyknięcie fasoli Mockito i CDI, czy wywołanie @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; 

    //... 

} 

spodziewałem Mockito zadzwonić PostConstruct, ale musiałam dodać:

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

Czy istnieje lepszy sposób to zrobić?

+1

inny projekt, który jest zarówno bardziej czytelne i łatwiejsze do sprawdzenia, czy nie używać '@ PostConstruct' w ogóle, i użyć konstruktora wtrysku zamiast zastrzyku pola – geoand

+0

@geoand ale co to jest wstrzyknięcie konstruktora? – gurghet

+0

Zobacz moją odpowiedź poniżej – geoand

Odpowiedz

5

Chociaż nie jest to bezpośrednia odpowiedź na twoje pytanie, sugeruję jednak, abyś odszedł od wtrysku pola i zamiast tego używał wtrysku konstruktora (czyni kod bardziej czytelnym i testowalnym).

Twój kod będzie wyglądać następująco:

class Patient { 

    private final Syringe syringe; 

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

} 

Wtedy twój badanie byłoby po prostu:

@RunWith(MockitoJUnitRunner.class) 
class TestCase { 

    @Mock 
    Syringe siringeMock; 

    Patient patient; 

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

} 

Aktualizacja

Jak sugeruje Erik-Karl w komentarzach, można użyć @InjectMocks aby pozbyć się metody konfiguracji. Rozwiązanie działa, ponieważ Mockito użyje odpowiedniego wtrysku konstruktora (jak opisano here). Kod będzie wtedy wyglądać tak:

@RunWith(MockitoJUnitRunner.class) 
class TestCase { 

    @Mock 
    Syringe siringeMock; 

    @InjectMocks 
    Patient patient; 

} 
+1

Jest to DOS bardziej sprawdzalny, dziękuję doc! – gurghet

+0

@gurghet Twoje powitanie! – geoand

+3

Jest nie tylko bardziej testowalny, ale otrzymuje pewne gwarancje bezpieczeństwa wątków, ponieważ pola są ostateczne. Zauważ, że nawet przy powyższym kodzie, musiałbyś ręcznie wywołać metodę '@ PostConstruct' – NamshubWriter