Java 即使呼叫已验证,连接也未关闭
你能帮我理解这段代码吗 我正在尝试验证数据库连接是否已关闭。 即使Mocikto验证是否调用了close()方法,连接也不会关闭 我正在测试的代码(它在con.close()中使用): 和测试:Java 即使呼叫已验证,连接也未关闭,java,spring,jdbc,junit,mockito,Java,Spring,Jdbc,Junit,Mockito,你能帮我理解这段代码吗 我正在尝试验证数据库连接是否已关闭。 即使Mocikto验证是否调用了close()方法,连接也不会关闭 我正在测试的代码(它在con.close()中使用): 和测试: public class DataProviderTest { @InjectMocks DataProvider dataProvider; @Mock OracleConnection oracleConnection; @Mock Databa
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>
}
}
公共类DataProviderTest{
@注射模拟
数据提供者数据提供者;
@嘲弄
OracleConnection OracleConnection;
@嘲弄
数据库元数据数据库元数据;
@嘲弄
池数据源;
@嘲弄
OracleCallableStatement或OracleCallableStatement;
@之前
public void setUp()引发SQLException{
initMocks(this);
ReflectionTestUtils.setField(数据提供程序,“ParseSqlErrorFunction”,“一些SQL错误函数”);
Mockito.when(dataSource.getConnection()).thenReturn(oracleConnection);
Mockito.when(oracleConnection.getMetaData()).thenReturn(databaseMetadata);
Mockito.when(oracleConnection.prepareCall(Mockito.anyString())。然后返回(oracleCallableStatement);
}
@试验
public void closeConnectionTest()引发SQLException{
OracleConnection=dataProvider.getConnection();
OracleCallableStatement=OracleCallableStatement;
assertFalse(connection.isClosed());
dataProvider.closeConnection(语句,连接);
Mockito.verify(连接,Mockito.atLeast(1)).close();//传递
Mockito.verify(语句,Mockito.atLeast(1)).close();//传递
assertTrue(connection.isClosed());//应为:但为:
}
}
测试中的连接是模拟对象,因此运行close方法实际上不会将isClosed的值从false更改为true。您可以删除最后一个assert,因为它是一个mock,您只需验证close方法是否在连接上执行,您不需要验证它所做的事情。您可能想考虑切换使用资源,而不是使用像您的代码一样的方法。在Java7中引入try with resources后,这些拐杖基本上已经过时,不再需要了。@MarkRotteveel如果可以的话,我会:)
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>
}
}