2017-02-17 2 views
0

Ich versuche, eine Klasse mit EasyMock Einheit testen. Um die Dinge zu vereinfachen, habe ich unten ein Beispiel gemacht. Ich möchte, dass die StringBuilder-Instanz beim Testen durch die EasyMock-Instanz ersetzt wird. (Da es nicht die Funktionalität des StringBuilders ist, die ich testen möchte.) Leider funktioniert das im folgenden Beispiel nicht. In anderen Tests habe ich eine Problemumgehung, indem ich die Instanzvariablen mit einer EasyMock-Instanz festlege, aber in diesem Beispiel kann ich das nicht, da es sich um ein lokal instantiiertes Objekt handelt, das mir wichtig ist.Wie ersetze ich meine Instanzen mit Easymock

Wer kann mir helfen?

Die Klasse getestet:

package example.easymock 

public class Example { 

    public String exampleMethod() { 
     StringBuilder string = new StringBuilder(); 
     string.append("hello"); 
     return string.toString(); 
    } 
} 

Die Testklasse:

package example.easymock 

import needed classes 

public class ExampleTest { 

    @Test 
    public void exampleMethodTest() { 
     StringBuilder stringMock = EasyMock.createMock(); 
     Example example = new Example(); 
     stringMock.append("hello"); 
     EasyMock.expect(stringMock.toString()).andReturn("hi"); 

     EasyMock.replay(stringMock); 

     example.exampleMethod(); 
    } 
} 

Antwort

2

Mit nur EasyMock es unmöglich sein wird. PowerMock tut Macht enthalten, dass aber zu tun:

expectNew(StringBuilder.class).andReturn(stringMock); 

Sie müssen richtig dafür zu arbeiten natürlich PowerMock Konfiguration einzurichten - mehr here

sehen, dass nichts an der Tatsache ändert, dass genau diese Unmöglichkeit ist, was (teilweise) zu weit verbreiteten Inversion of Control als ein Konstruktionsprinzip führt. In der Regel ist jede Methode, die Sie nicht testen können, eine Methode, die besser refaktoriert werden kann (und testbar ist). PowerMock sollte nur für Tests verwendet werden, wenn der Code selbst nicht besser geändert werden kann.

Das ist natürlich vorausgesetzt, dass StringBuilder nur ein Beispiel ist und nicht buchstäblich, was Sie versuchen zu tun. Wenn das nicht der Fall ist, können Sie davon ausgehen, dass alle Methoden, die zu Sprachbibliotheken gehören, wie angekündigt funktionieren.

+0

PowerMock kann tatsächlich Konstruktoren von Klassen vortäuschen. So ist es * mit PowerMock möglich. – dav1d

+0

@ dav1d verdammt, das Ding ist mächtig, wahr. – Deltharis

+0

Um hinzuzufügen, wie man es mit TestNG + PowerMock + Mockito macht, ist es hilfreich: Bereiten Sie die zu testende Klasse vor: '' @PrepareForTest (SomeService.class) 'dann" spotten "Sie einfach den Konstruktor:' whenNew (Date .class) .withNoArguments(). thenReturn (jetzt); ' – dav1d

Verwandte Themen