2016-09-30 40 views
1

我想通過嘲諷類B1的重寫方法a1Method2來測試我的Service類方法testB1Method2。我不想改變A1B1。我正在使用mockito 1.9.0和powermockito 1.4.12。下面的代碼我想:使用mockito powermokito的模擬重寫方法

UnitTestService類:

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!"); 
    } 

} 

服務類:

public class Service { 

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

} 

類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類:

public class B1 extends A1 { 

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

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

} 

我在eclipse中使用testNG運行類UnitTestService。在這裏實際的B1 a1Method2類中的方法正在調用,因爲它在控制檯中打印「===== from a1Method2」。即:在這裏,似乎mockito不能嘲笑這種方法。

我應該在UnitTestService課上做什麼代碼更改以模擬B1級a1Method2

+1

[使用PowerMockito.whenNew()沒有被模擬並調用原始方法]的可能重複(http://stackoverflow.com/questions/25317804/using-powermockito-whennew-is-not-getting-mocked-和原始方法被稱爲) – Magnilex

回答

0

您創建了很難測試代碼,絕對沒有什麼好的理由。 什麼是打破你的脖子是這個小小的電話新的B1在您的服務類。

如果您將爲該對象使用依賴項注入;那麼你絕對不需要處理powermock和mocking繼承的方法。因爲那樣你可以簡單地創建一個「模擬」B1;把它傳遞給你的服務;然後你有完整的控制你的測試過程中會發生什麼。

因此,這裏可行的替代方案可能是通過簡單地改進您的生產代碼來避免複雜的測試設置,以便於測試。

觀看那些videos以更好地理解我在說什麼!

+0

我不應該在服務方法中創建任何新的對象? –

+0

我在說:當你使用** new **時,你很難(很容易!)控制你的對象。所以,避免調用* new * **可以使你的代碼更好。如下所述:A)閱讀**依賴注入**和B)觀看這些視頻;至少第一個...... – GhostCat