2017-04-19 1 views
2

Ich schreibe Einheit für den folgenden Code, ich bekomme NPE, obwohl ich die Felder verspottete, wie kann ich das auflösen. Diese Felder sind vorhanden mit @Inject AnmerkungWie kommt man mit NPE für @Inject-Feld während der Unit-Tests?

@Component 
interface A { 
    void run(); 
} 

class B { 
    @Inject 
    A a; 

    void someMethod() { 
     a.run(); 
    }} 

class C{ 
    @Inject 
    B b; 

    void anotherMethod() { 
     b.someMethod(); 
    } 
} 

class CTest { 
    @Mock 
    B b; 
    // remains null when invoked in the actual class though its mocked instance is 
    // present here 

    @Mock 
    A a; 
    //// remains null when invoked in the actual class though its mocked instance 
    //// is present here 

    @InjectMocks 
    C c; 

    @Before 
    public void initialize() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void test() { 
     c.anotherMethod(); 
    } 

} 

So wie kann ich den verspotteten Wert in der aktuellen Klasse, wo das Feld mit @Inject mit Mockito injiziert wird?

Antwort

1

Meine Vermutung ist, dass Sie Ihre CTest Klasse mit @RunWith(MockitoJUnitRunner.class) annotieren sollen und Ihre vor-Methode entfernen, da es unnötig werden wird (@RunWith den Trick der Injektion von Mocks tun).

UPDATE

Eigentlich lief ich den Code in meiner IDE. Und alles ist in Ordnung, keine NPE. Wahrscheinlich müssen Sie überprüfen, ob Ihre Importe korrekt sind. Hier sind meine mit Ihnen zu vergleichen:

import org.junit.Before; 
import org.junit.Test; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 
import javax.inject.Inject; 
import org.springframework.stereotype.Component; 

Sie bitte auch, darauf achten, dass Sie Class C mit Großbuchstaben erklärt (sollte class C sein) in Frage, so dass dies sehr Code wird nicht kompiliert.

+0

Hey vielen Dank für die Antwort, dieser Code ist nur zum Beispiel und nicht meine eigentliche Code. Es wurde vorgeschlagen, entweder @RunWith (MockitoJUnitRunner.class) oder MockitoAnnotations.initMocks (this) - zu verwenden, siehe http://stackoverflow.com/a/28969255/2340345 – user2340345