2013-01-09 60 views
5

我試圖用mockito來嘲笑Query類的JDBI,但是它不能嘲笑其基類SqlStatement的方法。嘲笑一個類的問題

在when語句實際調用基類中的具體實現時運行代碼時失敗,並且NullPointerException失敗。

import java.util.Map; 

import org.junit.Test; 
import org.skife.jdbi.v2.Query; 

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

public class TestClass { 
    @Test 
    public void testBind() { 
     Query<Map<String,Object>> mockQuery = mock(Query.class); 
     when(mockQuery.bind("xxx", 5)).thenReturn(mockQuery); //this line fails 
     //more stuff here 
    } 
} 

我已經試過了EasyMock這也並得到了相同的結果,它不能嘲笑這個方法。

更多信息:

  • 版本的Mockito是1.9.5
  • JDBI版本2.4.1(一,目前附帶dropwizard)

唯一的例外是:

java.lang.NullPointerException 
     at org.skife.jdbi.v2.SQLStatement.bind(SQLStatement.java:434) 
     at TestClass.testBind(TestClass.java:17) 
      at .... 

任何想法如何解決這個問題?

+0

這不是一個答案,但根據我的經驗,嘲笑這種DAO代碼是浪費時間。它不會暴露您在使用JDBI API時所犯的錯誤。根據真實的數據庫編寫測試。 – artbristol

回答

4

bind方法SqlStatement是最後的(對於爲例SQLStatement#bind(String, int)),所以他們使用的Mockito你不能嘲笑,這是JVM (編輯:)是的Mockito的限制不能在旁路時刻。


EDIT2:請注意,下面點了意見,有一個什麼樣的上面寫了一些誤解,這需要在我的部分澄清:


您的選項是改變設計,所以你不會有存根的互動,也必須使用PowerMock它使用的技巧與類加載器重寫類的字節碼(不是我的首選方法複雜,雖然PowerMock技術上令人印象深刻)。

希望有所幫助。

+1

這是Mockito的限制,而不是JVM的限制,正如您自己的PowerMock支持它的評論所暗示的那樣。更不用說JMockit *也支持它,儘管它不會「用類加載器使用複雜的技巧」。 –

+0

@Rogerio看到編輯:「那個mockito此刻不能繞過」 – Brice

+1

我看到了。它仍然不是JVM的限制,就連官方的Mockito文檔[說](http://code.google.com/p/mockito/wiki/FAQ)。 (但是我重複自己...)如果有一個目標「繞過它」,我會建議整合來自PowerMockito的代碼(即使用自定義類加載器)。唯一的其他選擇是使用JMockit的方法,使用'java.lang.instrument'。 –

0

嘗試

Mockito.doReturn(mockQuery).when(mockQuery).bind("xxx",5); 
+0

同樣的錯誤,仍然調用基類方法 – LiorH

+0

您可以發佈您正在使用的Mockito的異常和版本嗎?我已經用Mockito 1.9.0和jdbi 2.9.4 – bstick12

+0

信息成功地運行了這兩種方式 – LiorH