2017-02-28 5 views
2

Wie man einen Instanzmethodenaufruf von der statischen Methode vortäuschen kann, während ich junit für die statische Methode schreibe? Ich schreibe Tests für vorhandenen Code.Wie man einen Instanzmethodenaufruf von der statischen Methode vortäuschen kann, während man junit für die statische Methode schreibt?

class A 
{ 
    public static D methodX() 
    { 
     B b = new B(); 
     C c = b.doSomething(); 
    } 
} 

class B 
{ 
    public C doSomething() 
    { 
    return C; 
    } 
} 

class Atest 
{ 
    @Test 
    public void testMethodX() 
    { 
     B b =Mockito.mock(B.class); 
     Mockito.when(b.doSomething()).thenReturn(new C()); 
     A.methodX(); 
     // some assertions 
    } 
} 

Antwort

0

Durch Ihre Tag Auswahl wissen Sie bereits, dass Sie für PowerMockito gehen müssen.

Um eine verspottet Version der B-Klasse zu injizieren i folgendes tun würde:

Eine Klasse

class A 
{ 
    public static D methodX() 
    { 
     B b = getBInstance(); 
     C c = b.doSomething(); 
    } 

    static B getBInstance(){ 
     return new B(); 
    } 

} 

Testklasse

@RunWith(PowerMockRunner.class) 
@PrepareForTest(A.class) 
class Atest 
{ 
    @Test 
    public void testMethodX() 
    { 
     B b =Mockito.mock(B.class); 
     PowerMockito.stub(PowerMockito.method(A.class, "getBInstance")).toReturn(b); 
     Mockito.when(b.doSomething()).thenReturn(new C()); 
     A.methodX(); 
     // some assertions 
    } 
} 

Dank PowerMockito.stub(PowerMockito.method Anruf Sie werden nur die getBInstance statische Methode und in Am Ende rufen Sie die echte A.methodX Implementierung.

1

Ein anderer völlig anderer Ansatz: Do nicht nicht testbaren Code schreiben. statische ist eine Anomalie in guten OO-Designs; zum ersten Schritt ist einfach nicht schreiben statische Methoden.

Und wenn Sie gute Gründe haben, dies noch zu tun; Schreiben Sie sie dann so, dass Sie sie vernünftig testen können.

Ja, es ist möglich, an PowerMock (ito) zu wenden, um dies zu lösen, aber je mehr Sane Ansatz ist einfach zu beheben Sie Ihre Produktion Design.

Die PowerMock (ito) -Frameworks sind mit bestimmten Kosten verbunden; und kann leicht vermieden werden.

Also meine Antwort: lernen, wie man testbar Code erstellen; und vergessen Sie einfach PowerMock (Sie können beginnen, indem Sie diese videos ansehen).

Verwandte Themen