2016-03-31 2 views
0

J'ai un scénario de classe inférieur. Lors du test de MyTestableClass, je souhaite traiter la classe Autowired. Je voudrais simuler seulement variable dans la classe AutoWired.Mockito Mock run Classe Autowired Object

classe échantillon est aussi dessous-

public class MyTestableClass { 

    @Autowired 
    private MyServiceClass service; 

    public void handleError(){ 
    ... 
    service.doSomething(); 

    } 
} 

public class MyServiceClass { 

    @Autowired 
    private JMSChannel channel; 

    public void doSomething(){ 
     System.out.println("Inside Service class"); 
     ..... 
     channel.isAvailable(); 
     ..... 
    } 
} 

@RunWith(MockitoJUnitRunner.class) 
public class MyTestableClassTest { 
    private MyTestableClass testClass= new MyTestableClass(); 

    private JMSChannel channel; 

    @Before 
    public void init(){ 
    channel= mock(JMSChannel.class); 
    when(channel.isAvailable()).thenReturn(Boolean.TRUE); 
    } 

    @Test 
    public void test(){ 
     testClass.handleError(); 
    } 
} 

Par exemple, la console devrait me donner "Classe de service intérieur" avant de retourner vrai.

Merci à l'avance!

+0

+1, Comment puis-je créer une instance du service Autowired? Je ne veux pas me moquer de ça, pour entrer dans doSomething(). Merci! –

+1

Idéalement, passer de l'injection de champ à l'injection du constructeur, puis passer le simulacre au constructeur. – chrylis

+0

@chrylis, puis-je demander par exemple/code? –

Répondre

1

Vous devez créer et instance de votre service (ou un simulacre de celui-ci) et définir son canal à votre moqué, puis définissez MyTestableClass#service à celui-ci. Quelque chose comme:

@Before 
public void init(){ 
    channel= mock(JMSChannel.class); 
    when(channel.isAvailable()).thenReturn(Boolean.TRUE); 
    MyServiceClass service = new MyServiceClass(); 
    ReflectionTestUtils.setField(service, "channel", channel); 
    myTestableClass = new MyTestableClass(); 
    ReflectionTestUtils.setField(myTestableClass, "service", service); 
} 

avec ReflectionTestUtils de spring-test (NB: vous pouvez utiliser un setter à la place)

+2

Mockito est livré avec la classe [Whitebox] (http://docs.mockito.googlecode.com/hg/org/mockito/internal/util/reflection/Whitebox.html) qui fait essentiellement la même chose que ReflectionTestUtils –

+0

"java.lang.IllegalArgumentException: Impossible de trouver le champ [channel] de type [null] sur la cible [MyServiceClass]" lors de l'exécution de ce test. –

+0

Ce n'est pas une réponse prête à l'emploi par copier coller, juste un point de départ/explication. J'ai édité une erreur qui pourrait expliquer votre erreur. –