2017-04-14 282 views
0

我正在使用JUnit和Mockito編寫使用Jersey的REST服務的測試用例。我得到一個null對象而不是Response類的模擬對象。被測Mocking使用Mockito的泛型類型

代碼

Response response = builder 
         .put(Entity.entity(new ByteArrayInputStream(jsonObj.toString().getBytes()), MediaType.APPLICATION_JSON), Response.class); 

測試用例:

private Invocation.Builder builder; 
private Entity<ByteArrayInputStream> inputStream; 
private Response response; 
@Before 
public void setUp() throws Exception { 
    builder = mock(Invocation.Builder.class); 
    inputStream = (Entity<ByteArrayInputStream>)mock(Entity.class); 
    response = mock(Response.class); 
} 

@Test 
public void myTest() { 
when(builder.put(inputStream, Response.class)).thenReturn(response); 
} 

所以這行代碼給了我一個空的迴應。有沒有其他的方式來做到這一點。

謝謝。

回答

0

我已經解決了這個問題,所以我想分享一下我實際上做了什麼。 Mockito.when(builder.put(any(Entity.class), any(Class.class))).thenReturn(response);

上面的聲明給了我嘲笑的迴應。現在我可以用模擬的Response對象做任何事情。我可以嘲笑getStatus方法並返回狀態碼或其他任何東西。

希望這可以幫助那些Mockito和PowerMockito Api。

0

那是因爲你混合了各種各樣的東西。

你的產品代碼的作用:

Entity.entity(new ByteArrayInputStream(... 

所以,你得到了什麼有:

  • 一個靜態調用(Entity.entity()
  • 調用new

這兩個操作不能被Mockito嘲笑。它是如此簡單。

爲了模擬靜態方法調用,您必須查看框架,如PowerMock(ito)或JMockit。

但我寧願推薦一個不同的解決方案:考慮重新生產您的生產代碼。而不是靜態+新的呼叫;創造這樣

interface EntityProvider { 
    public Entity of(bytes[] data, MediaType type); 
} 

您可以輕鬆創建一個使用您的當前代碼的實現類 - 但測試的目的,你可以依賴項注入該接口(通過Mockito.mock()創建)的模擬;突然之間,你的整個代碼再次被Mockito測試。

無需研究其他模擬框架(至少PowerMockito帶有一定的成本 - 它不像「只是切換到其他框架」那麼簡單)。