@Test(expected = IllegalArgumentException.class) public void delegateIsRequired() throws Exception { ExtendedConnectionDataSourceProxy tested = new ExtendedConnectionDataSourceProxy(null); tested.afterPropertiesSet(); }
@Test public void testUsesCurrentTransaction() throws Exception { DataSource ds = mock(DataSource.class); Connection con = mock(Connection.class); when(con.getAutoCommit()).thenReturn(false); PreparedStatement ps = mock(PreparedStatement.class); when(con.prepareStatement("select foo from bar", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT)).thenReturn(ps); when(ds.getConnection()).thenReturn(con); when(ds.getConnection()).thenReturn(con); con.commit(); PlatformTransactionManager tm = new DataSourceTransactionManager(ds); TransactionTemplate tt = new TransactionTemplate(tm); final JdbcCursorItemReader<String> reader = new JdbcCursorItemReader<>(); reader.setDataSource(new ExtendedConnectionDataSourceProxy(ds)); reader.setUseSharedExtendedConnection(true); reader.setSql("select foo from bar"); final ExecutionContext ec = new ExecutionContext(); tt.execute( new TransactionCallback<Void>() { @Override public Void doInTransaction(TransactionStatus status) { reader.open(ec); reader.close(); return null; } }); }
TransactionTemplate tt = new TransactionTemplate(tm); final StoredProcedureItemReader<String> reader = new StoredProcedureItemReader<>(); reader.setDataSource(new ExtendedConnectionDataSourceProxy(ds)); reader.setUseSharedExtendedConnection(true); reader.setProcedureName("foo_bar");
final ExtendedConnectionDataSourceProxy csds = new ExtendedConnectionDataSourceProxy(); csds.setDataSource(ds); PlatformTransactionManager tm = new DataSourceTransactionManager(csds);
@Test public void testOperationWithDirectCloseCall() throws SQLException { Connection con = mock(Connection.class); DataSource ds = mock(DataSource.class); when(ds.getConnection()).thenReturn(con); // con1 con.close(); when(ds.getConnection()).thenReturn(con); // con2 con.close(); final ExtendedConnectionDataSourceProxy csds = new ExtendedConnectionDataSourceProxy(ds); Connection con1 = csds.getConnection(); csds.startCloseSuppression(con1); Connection con1_1 = csds.getConnection(); assertSame("should be same connection", con1_1, con1); con1_1.close(); // no mock call for this - should be suppressed Connection con1_2 = csds.getConnection(); assertSame("should be same connection", con1_2, con1); Connection con2 = csds.getConnection(); assertNotSame("shouldn't be same connection", con2, con1); csds.stopCloseSuppression(con1); assertTrue("should be able to close connection", csds.shouldClose(con1)); con1_1 = null; con1_2 = null; con1.close(); assertTrue("should be able to close connection", csds.shouldClose(con2)); con2.close(); }
@Test public void unwrapForUnsupportedInterface() throws Exception { ExtendedConnectionDataSourceProxy tested = new ExtendedConnectionDataSourceProxy(new DataSourceStub()); assertFalse(tested.isWrapperFor(Unsupported.class)); try { tested.unwrap(Unsupported.class); fail(); } catch (SQLException expected) { // this would be the correct behavior in a Java6-only recursive implementation // assertEquals(DataSourceStub.UNWRAP_ERROR_MESSAGE, expected.getMessage()); assertEquals("Unsupported class " + Unsupported.class.getSimpleName(), expected.getMessage()); } }
final ExtendedConnectionDataSourceProxy csds = new ExtendedConnectionDataSourceProxy(ds);
@Test public void unwrapForSupportedInterface() throws Exception { DataSourceStub ds = new DataSourceStub(); ExtendedConnectionDataSourceProxy tested = new ExtendedConnectionDataSourceProxy(ds); assertTrue(tested.isWrapperFor(Supported.class)); assertEquals(ds, tested.unwrap(Supported.class)); }
@Test public void unwrapForSmartDataSource() throws Exception { ExtendedConnectionDataSourceProxy tested = new ExtendedConnectionDataSourceProxy(new DataSourceStub()); assertTrue(tested.isWrapperFor(DataSource.class)); assertEquals(tested, tested.unwrap(DataSource.class)); assertTrue(tested.isWrapperFor(SmartDataSource.class)); assertEquals(tested, tested.unwrap(SmartDataSource.class)); }