[ 
https://issues.apache.org/jira/browse/DERBY-5726?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-5726:
--------------------------------------

    Issue & fix info: Patch Available
    
> 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
>         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

        

Reply via email to