想知道是否有人可以帮助或做过类似的事情。我试图模拟从自定义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) ...
以前有人尝试过这样的事情吗?还是我错过了另一个我应该嘲笑的对象?
CLOB.getDBAccess(connection)
是 CLOB
类的静态方法,因此不能用 Mockito 模拟。
您可以使用Powermock模拟静态。
我以前没有见过CLOB
类的getDBAccess
方法。 但是从上面看,在我看来,它可能final
,这意味着你不能用 Mockito 存根。 我建议使用真实的CLOB
,而不是模拟的。 模拟值对象通常是一个坏主意,而CLOB
绝对是一个值对象。