2017-04-19 3 views
2

Im écrire des tests unitaires pour le code ci-dessous, Im obtenir NPE même si Im mocking les champs, Comment puis-je résoudre cela. Ces champs sont présents avec @Inject annotationComment sortir avec NPE pour le champ @Inject pendant le test unitaire?

@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(); 
    } 

} 

Alors, comment puis-je obtenir la valeur moquée dans la classe réelle où le champ est injecté à l'aide @Inject Mockito?

Répondre

1

Je pense que vous devriez annoter votre classe CTest avec @RunWith(MockitoJUnitRunner.class) et retirez votre avant-méthode car elle deviendra unecessary (@RunWith fera l'affaire de l'injection se moque).

MISE À JOUR

En fait, je couru votre code dans mon IDE. Et tout va bien, pas de NPE. Vous devez probablement vérifier que vos importations sont correctes. Voici la mienne sont à comparer avec le vôtre:

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; 

Aussi, s'il vous plaît, faites attention que vous avez déclaré Class C avec lettre majuscule (doit être class C) dans votre question, donc ce code ne sera pas très compiler.

+0

Hey merci pour la réponse, Ce code est juste par exemple et pas mon code réel. Il est suggéré d'utiliser soit @RunWith (MockitoJUnitRunner.class) ou MockitoAnnotations.initMocks (this) - se référer http://stackoverflow.com/a/28969255/2340345 – user2340345