[
https://issues.apache.org/jira/browse/DERBY-5726?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Knut Anders Hatlen resolved DERBY-5726.
---------------------------------------
Resolution: Fixed
Fix Version/s: 10.9.0.0
Issue & fix info: (was: Patch Available)
Committed revision 1332967.
> Make it more difficult to forget calling super.tearDown() from
> BaseJDBCTestCase's subclasses
> --------------------------------------------------------------------------------------------
>
> Key: DERBY-5726
> URL: https://issues.apache.org/jira/browse/DERBY-5726
> Project: Derby
> Issue Type: Improvement
> Components: Test
> Affects Versions: 10.9.0.0
> Reporter: Knut Anders Hatlen
> Assignee: Knut Anders Hatlen
> Priority: Minor
> Fix For: 10.9.0.0
>
> Attachments: d5726-1a.diff
>
>
> Many of the classes that extend BaseJDBCTestCase and override the tearDown()
> method, forget to call super.tearDown(), and thereby prevent resources from
> being freed after completion. We should add a mechanism that enforces the
> correct behaviour.
> If we were starting from scratch, we might have made
> BaseJDBCTestCase.tearDown() final and added a new overridable method that was
> called from BaseJDBCTestCase.tearDown() before it freed the statements and
> connections. Then there would be no way to prevent
> BaseJDBCTestCase.tearDown() from running in the subclasses. That would
> however require us to change all existing overrides of
> BaseJDBCTestCase.tearDown() (current count: 131), which would be a chunk of
> work.
> I'd rather suggest that we add an override of runBare() in BaseJDBCTestCase
> that asserts that the connection has been cleared out when a test case has
> completed successfully. Something like this:
> public void runBare() throws Throwable {
> super.runBare();
> // It's quite common to forget to call super.tearDown() when
> // overriding tearDown() in sub-classes.
> assertNull(
> "Connection should be null by now. " +
> "Missing call to super.tearDown()?", conn);
> }
> Then it would still be possible to forget to call super.tearDown(), but it
> would be discovered when trying to run the test.
> Adding the above method to BaseJDBCTestCase and running
> InternationalConnectTest gave this result:
> .....F.F....F
> Time: 5,748
> There were 3 failures:
> 1)
> testDriverManagerConnect(org.apache.derbyTesting.functionTests.tests.jdbcapi.InternationalConnectTest)junit.framework.AssertionFailedError:
> Connection should be null by now. Missing call to super.tearDown()?
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.runBare(BaseJDBCTestCase.java:431)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> 2)
> testBoundaries(org.apache.derbyTesting.functionTests.tests.jdbcapi.InternationalConnectTest)junit.framework.AssertionFailedError:
> Connection should be null by now. Missing call to super.tearDown()?
> at
> org.apache.derbyTesting.junit.BaseJDBCTestCase.runBare(BaseJDBCTestCase.java:431)
> (...)
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira