java - 即使验证呼叫,连接也不会关闭
问题描述
你能帮我理解这段代码吗?
我正在尝试验证数据库连接是否已关闭。即使 Mocikto 验证 close() 方法被调用,连接也没有关闭。
我正在测试的代码(它在 con.close() 中使用):
public static void closeConnection(CallableStatement cs, Connection conn) {
JdbcUtils.closeStatement(cs);
JdbcUtils.closeConnection(conn);
}
并测试:
public class DataProviderTest {
@InjectMocks
DataProvider dataProvider;
@Mock
OracleConnection oracleConnection;
@Mock
DatabaseMetaData databaseMetadata;
@Mock
PoolDataSource dataSource;
@Mock
OracleCallableStatement oracleCallableStatement;
@BeforeEach
public void setUp() throws SQLException {
MockitoAnnotations.initMocks(this);
ReflectionTestUtils.setField(dataProvider, "parseSQLErrorFuntion", "Some SQL error function");
Mockito.when(dataSource.getConnection()).thenReturn(oracleConnection);
Mockito.when(oracleConnection.getMetaData()).thenReturn(databaseMetadata);
Mockito.when(oracleConnection.prepareCall(Mockito.anyString())).thenReturn(oracleCallableStatement);
}
@Test
public void closeConnectionTest() throws SQLException {
OracleConnection connection = dataProvider.getConnection();
OracleCallableStatement statement = oracleCallableStatement;
assertFalse(connection.isClosed());
dataProvider.closeConnection(statement, connection);
Mockito.verify(connection, Mockito.atLeast(1)).close(); //pass
Mockito.verify(statement, Mockito.atLeast(1)).close(); //pass
assertTrue(connection.isClosed()); // expected: <true> but was: <false>
}
}
解决方案
测试中的连接是一个模拟对象,因此运行 close 方法实际上不会将 isClosed 的值从 false 更改为 true。
您可以删除最后一个断言,因为它是一个模拟,您只需要验证关闭方法是否已在连接上执行,您无需验证它做了什么。
推荐阅读
- kotlin - Kotlin Exposed 的异常处理 - 如何捕获唯一约束违规异常?
- r - 根据条件改变列,保留原始内容
- python - TypeError:无法读取“列表”类型的对象
- jenkins - Jenkins 声明式管道 - 多分支运行一一构建
- ios - Swift Firebase downloadURL 返回 nil
- python - 如何使用 selenium 和 python 自动化 Flash?
- android - chmod +x gradlew ./gradlew clean build --refresh-dependencies --stacktrace 失败
- flex-lexer - 为正则表达式分配一个变量名并在另一个正则表达式中使用它
- javascript - 如何计算从 Ricoh Theta S Dual FIsh Eye 到 Three.js r71 SphereGeometry 的 UV 映射
- python - Scipy.optimize.minimize 的 x0(初始猜测)等效于 pyOpt?