2015-03-28 17 views
6

Ich habe diesen Code:Mockito und CDI Bean Injektion, ruft @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; 

    //... 

} 

I Mockito PostConstruct nennen erwartet, aber ich hatte hinzuzufügen:

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

Gibt es einen besseren Weg, dies zu tun?

+1

ein anderes Design, das sowohl besser lesbar und einfacher zu testen ist, ist überhaupt nicht '@ PostConstruct' zu verwenden, und verwendet Konstruktor Injektion statt Feldeinkopplung – geoand

+0

@geoand aber Was ist eine Konstruktoreinspritzung? – gurghet

+0

Siehe meine Antwort unter – geoand

Antwort

5

Obwohl keine direkte Antwort auf Ihre Frage, aber ich schlage vor, dass Sie weg von der Feldinjektion und verwenden Sie Konstruktor Injektion stattdessen (macht Code lesbarer und testbar).

Ihr Code würde wie folgt aussehen:

class Patient { 

    private final Syringe syringe; 

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

} 

Dann würde dein Test einfach sein:

@RunWith(MockitoJUnitRunner.class) 
class TestCase { 

    @Mock 
    Syringe siringeMock; 

    Patient patient; 

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

} 

aktualisieren

Wie Erik-Karl in den Kommentaren vorgeschlagen, könnten Sie @InjectMocks verwenden um die Setup-Methode loszuwerden. Die Lösung funktioniert, weil Mockito die entsprechende Konstruktorinjektion verwendet (wie beschrieben here). Der Code würde dann wie folgt aussehen:

@RunWith(MockitoJUnitRunner.class) 
class TestCase { 

    @Mock 
    Syringe siringeMock; 

    @InjectMocks 
    Patient patient; 

} 
+1

Dies ist viel mehr testbar, danke doc! – gurghet

+0

@gurghet Willkommen! – geoand

+3

Nicht nur ist es mehr testbar, aber Sie erhalten einige Thread-Sicherheitsgarantien, indem Sie die Felder endgültig haben. Beachten Sie, dass Sie selbst mit dem obigen Code Ihre '@ PostConstruct'-Methode manuell aufrufen müssen. – NamshubWriter