使用Mockito从数据库模拟CLOB

时间:2013-09-27 10:48:38

标签: java oracle mockito

想知道是否有人可以提供帮助或做过类似的事情。我试图模拟从自定义ClobFactory返回Oracle CLOB。我使用以下代码来创建CLOB

CLOB clob = CLOB.createTemporary(connection, false, CLOB.DURATION_SESSION);
try (final Writer clobWriter = clob.setCharacterStream(1)) {
    clobWriter.write(profile);
} catch (IOException e) {
    throw new SQLException(e);
}
return clob;

我的测试我已经设置了以下嘲笑

@Mock OracleDataSource        dataSource;
@Mock CreateProfileParameters parameters;
@Mock ClobDBAccess            clobDbAccess;
@Mock OracleConnection        connection;

@Mock ClobFactory clobFactory;
@Mock CLOB        clob;
@Mock Writer      clobWriter;

....

when(dataSource.getConnection()).thenReturn(connection);
when(CLOB.getDBAccess(connection)).thenReturn(clobDbAccess);
when(clobDbAccess.createTemporaryClob(connection, false, CLOB.DURATION_SESSION, (short) 0)).thenReturn(clob);
when(CLOB.createTemporary(connection, false, CLOB.DURATION_SESSION)).thenReturn(clob);
when(ClobFactory.getClob(connection, dataString)).thenReturn(clob);

但是每次运行测试时我都会收到NullPointerException,指向第二行 -

Stacktrace was: java.lang.NullPointerException
at oracle.sql.CLOB.getDBAccess(CLOB.java:1525) ...

有没有人尝试过这样的事情?或者我错过了另一个我应该嘲笑的对象?

2 个答案:

答案 0 :(得分:1)

方法CLOB.getDBAccess(connection)CLOB类的静态方法,因此无法使用Mockito进行模拟。

您可以使用Powermock模拟静态。

答案 1 :(得分:0)

我之前没有见过getDBAccess类的CLOB方法。但是看看上面的内容,在我看来它可能是final,这意味着你不能用Mockito来存根。我建议使用真实的CLOB,而不是模拟的。模拟值对象通常是个坏主意,而CLOB绝对是一个值对象。