嘲弄一堂课的问题

时间:2013-01-09 17:29:47

标签: java mockito jdbi

我正在尝试使用mockito模拟JDBI的Query类,但它无法模拟其基类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 ....

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

bind中的

SqlStatement方法是最终的(例如SQLStatement#bind(String, int)),所以你不能使用Mockito来模拟它们,这是jVM的限制(编辑:)那个模拟目前无法绕过

<小时/> EDIT2:请注意,正如下面的评论指出的那样,对上面所写的内容存在一些误解,这需要我做出澄清:


您的选择是更改您的设计,这样您就不必将这些交互存根,或者您必须使用PowerMock,它使用类加载器的复杂技巧来重写类字节码(不是我喜欢的方法,尽管PowerMock技术上令人印象深刻)。

希望有所帮助。

答案 1 :(得分:0)

尝试

Mockito.doReturn(mockQuery).when(mockQuery).bind("xxx",5);
相关问题