2016-03-31 19 views
0

Ich habe unter Klasse Szenario. Beim Testen von MyTestableClass möchte ich die Autowired-Klasse verarbeiten. Ich möchte nur Variable in AutoWired Klasse spotten.Mockito Mock Run Autowired Klasse Objekt

Beispielklasse ist wie unten-

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

Zum Beispiel Console me "Inside Service-Klasse" geben sollte, bevor wahr zurück.

Vielen Dank im Voraus!

+0

+1, Wie erstelle ich eine Instanz von Autowired Service? Ich will es nicht verspotten, um etwas zu tun(). Vielen Dank! –

+1

Im Idealfall von der Feldinjektion zur Konstruktorinjektion wechseln und dann den Schein an den Konstruktor übergeben. – chrylis

+0

@chrylis, darf ich zum Beispiel/code fragen? –

Antwort

1

Sie müssen Ihren Dienst erstellen (und ein Mock davon) und stellen Sie seinen Kanal zu Ihrem verspotteten, und stellen Sie MyTestableClass#service zu diesem. Etwas wie:

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

mit ReflectionTestUtils von spring-test (NB: können Sie einen Setter stattdessen verwenden)

+2

Mockito kommt mit der [Whitebox] (http://docs.mockito.googlecode.com/hg/org/mockito/internal/util/reflection/Whitebox.html) -Klasse, die im Grunde das gleiche tut wie ReflectionTestUtils –

+0

Ich bekomme eine Ausnahme "java.lang.IllegalArgumentException: Das Feld [channel] vom Typ [null] im Ziel [MyServiceClass] konnte beim Ausführen dieses Testfalls nicht gefunden werden. –

+0

Dies ist keine kopierfähige Antwort, nur ein Ausgangspunkt/Erklärung. Ich habe einen Fehler behoben, der Ihren Fehler erklären könnte. –