2015-02-23 84 views
1

我讀這documentation on PowerMockito,它主要有兩個例子:如何完全模擬PowerMockito的課程?

  1. 懲戒靜態方法
  2. 部分嘲諷類

,但我想知道如何嘲笑時創建的一整類與new我在找Mockito的mock方法的PowerMockito版本。這應該能夠用我的生產代碼中的new Foo()替換爲Mockito mock(Foo.class)。以下是我已經試過:

import com.PowerMockitoProduction; 
import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpMethod; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

import static org.mockito.Matchers.any; 
import static org.powermock.api.mockito.PowerMockito.when; 


@RunWith(PowerMockRunner.class) 
@PrepareForTest(PowerMockitoProduction.class) 
public class PowerMockitoTest { 

    @Test(expected = UnsupportedOperationException.class) 
    public void test() throws Exception { 

     HttpClient mock = PowerMockito.mock(HttpClient.class); 
     when(mock.executeMethod(any(HttpMethod.class))).thenThrow(UnsupportedOperationException.class); 

     new PowerMockitoProduction().createClient(); 

    } 
} 

此測試失敗,此:

java.lang.Exception: Unexpected exception, expected<java.lang.UnsupportedOperationException> but was<java.lang.IllegalArgumentException> 

這裏是我的生產代碼:

package com; 

import org.apache.commons.httpclient.HttpClient; 

import java.io.IOException; 


public class PowerMockitoProduction { 

    public void createClient() throws IOException { 
     HttpClient client = new HttpClient(); 
     client.executeMethod(null); 
     System.out.println(client); 
    } 

} 

用我的調試器,我可以看到client是不像我預料的那樣是模擬的。

我使用也嘗試:

Object mock = PowerMockito.whenNew(HttpClient.class).withNoArguments().getMock(); 

但由於某些原因,它返回一個沒有完全構建的模擬。我也試過這樣:

HttpClient mock = PowerMockito.whenNew(HttpClient.class).withNoArguments().thenReturn(mock(HttpClient.class)).getMock(); 

但是,這給了我在該線路上ClassCastException。那麼,用PowerMockito完全模擬一個類的正確方法是什麼?

不像這個例子所暗示的,我試圖模擬出HttpClient的原因是我可以在稍後調用verify

+0

你說的完全嘲諷列一類的意思。對不起,我經歷了幾次你的問題,但無法理解那部分。 – 2015-02-23 20:47:15

+0

@RohitJain我正在尋找Mockito的'mock'方法的PowerMockito版本。 – 2015-02-23 20:47:52

+0

在'thenReturn()'之後,您不需要調用'getMock()'方法。 – 2015-02-23 20:49:33

回答

3

您不需要撥打getMock()方法找回嘲笑的對象。基本上,嘲笑實例的HttpClient,將其存儲在本地變量和使用:

@Test(expected=UnsupportedOperationException.class) 
public void test() { 
    HttpClient httpClient = mock(HttpClient.class); 
    PowerMockito.whenNew(HttpClient.class).withNoArguments().thenReturn(httpClient); 
    when(httpClient.executeMethod(any(HttpMethod.class))).thenThrow(UnsupportedOperationException.class); 

    new PowerMockitoProduction().createClient(); 
    verify(httpClient).executeMethod(null); 
} 
+0

這就是你認爲的做法嗎?似乎有點複雜。 – 2015-02-23 20:53:09

+2

是的。您必須將模擬實例存儲爲本地或實例變量,並將其用於周圍。 – 2015-02-23 20:53:59

相關問題