我试图用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
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用EasyMock并获得相同的结果,它无法模拟这种方法.
更多信息:
例外是:
java.lang.NullPointerException
at org.skife.jdbi.v2.SQLStatement.bind(SQLStatement.java:434)
at TestClass.testBind(TestClass.java:17)
at ....
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题?
bind中的方法SqlStatement是最终的(例如SQLStatement#bind(String, int)),因此您不能使用 Mockito 来模拟它们,这是 JVM 的限制(编辑:),mockito目前无法绕过。
您的选择是更改您的设计,这样您就不必存根这些交互,或者您必须使用 PowerMock,它使用类加载器的复杂技巧来重写类字节码(不是我首选的方法,尽管 PowerMock 在技术上令人印象深刻)。
\n\n希望有帮助。
\n