2016-09-30 7 views
1

Ich möchte meine Service Klassenmethode testB1Method2 durch Mock Overridden Methode a1Method2 der Klasse B1 testen. Ich möchte nichts in Klasse A1 und B1 ändern. Ich benutze Mockito 1.9.0 und Powermockito 1.4.12. Der folgende Code Ich versuche:Mock Overridden Methode mit Mockito Powermokito

UnitTestService Klasse:

import static org.mockito.Mockito.*; 

import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.MockitoAnnotations; 
import org.powermock.api.mockito.PowerMockito; 
import org.testng.Assert; 
import org.testng.annotations.Test; 

public class UnitTestService { 

    @Mock 
    B1 b1; 
    @InjectMocks 
    Service service = new Service(); 

    @Test 
    public void testB1Method2() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     when(b1.a1Method2()).thenReturn("mockvalue"); 
     PowerMockito.whenNew(B1.class).withArguments(Mockito.any()).thenReturn(b1); 
     String output = service.serviceMethod(); 
     System.out.println("=====" + output); 
     Assert.assertTrue("mockvalue".equalsIgnoreCase(output), "testA1Method2 failed!"); 
    } 

} 

Service-Klasse:

public class Service { 

    public String serviceMethod() { 
     B1 b1 = new B1("some data"); 
     return b1.a1Method2(); 
    } 

} 

Klasse A1:

public abstract class A1 { 

    public A1(String data) { 
     //doing many thing with data 
    } 

    public String a1Method1() { 
     return "from a1Method1"; 
    } 

    public String a1Method2() { 
     return "from a1Method2"; 
    } 

} 

B1 Klasse:

public class B1 extends A1 { 

    public B1(String data) { 
     super(data); 
    } 

    @Override 
    public String a1Method1() { 
     return "a1Method1 from B1 class"; 
    } 

} 

Ich benutze Klasse UnitTestService mit testNG in Eclipse. Und hier wird die aktuelle Methode in der Klasse B1 a1Method2 aufgerufen, da sie "===== from a1Method2" in der Konsole druckt. dh: hier scheint es, dass spöttisch diese Methode nicht verspotten kann.

Welche Codeänderung sollte ich in UnitTestService Klasse zu Scheinklasse B1 machen a1Method2?

+1

Mögliches Duplikat von [Mit PowerMockito.whenNew() wird nicht verspottet und die Originalmethode wird aufgerufen] (http://stackoverflow.com/questions/25317804/using-powermockito-whennew-is-not-getting-mocked- und-Original-Methode-ist-aufgerufen) – Magnilex

Antwort

0

Sie erstellt schwer Code dort zu testen, für absolut keinen guten Grund. Was ist dein Hals brechen ist dieser kleine Anruf zu neue B1 in Ihrer Serviceklasse.

Wenn Sie für dieses Objekt Dependency-Injektion verwenden würden; dann würden Sie absolut nicht mit powermock umgehen und vererbte Methoden verspotten müssen. Denn dann könntest du einfach einen "Mock" B1 erstellen; übergeben Sie das Ihrem Dienst; und dann haben Sie volle Kontrolle über, was während Ihres Tests geschieht.

Die praktikable Alternative könnte also sein, einen komplexen Testaufbau zu vermeiden, indem Sie einfach Ihren Produktionscode verbessern, damit er einfacher zu testen ist.

Beobachten Sie diese videos, um besser zu verstehen, worüber ich spreche!

+0

Ich sollte kein neues Objekt in Service-Methode erstellen? –

+0

Ich sage: Wenn Sie ** neu ** verwenden, verlieren Sie die Fähigkeit, (leicht!) Ihre Objekte zu steuern. Wenn Sie also Anrufe zu * new * ** vermeiden, können Sie Ihren Code verbessern. Wie gesagt: A) Lesen Sie über ** Abhängigkeitsinjektion ** und B) Sehen Sie sich diese Videos an; zumindest die ersten ... – GhostCat