[ 
https://issues.apache.org/jira/browse/OOZIE-1114?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13510174#comment-13510174
 ] 

Robert Kanter commented on OOZIE-1114:
--------------------------------------

If you do it that way, you'll have to do something like this:
{code}
testSomething() {
     Services services2 = new Services();
     services2.init();
     try {
          // do some test
     }
     finally {
          services2.destory();
     }
{code}
which is fine if the class only uses Services in one of its tests.  But if you 
have a class with a lot of tests, all of which use Services, its a lot of 
refactoring to put the try-finally block in there; its also not ideal because 
stuff that has to be done for all of the tests in a class should go into 
setUp() and tearDown() so you only have to write it once.  

For the most part, I'm going to do it like this:
{code}
     private Services services1;

     setup() {
          services1 = new Services();
          services1.init();
     }

     testSomething() {
          Services.get().destroy();          // destroys services1's services
          services1 = new Services();        // services1 now points to the new 
internal singleton
          services1.init();
          // do some test
     }

     tearDown() {
          services1.destroy();       // properly destroys the services
     }
{code}
but in some cases, I'll do the first way I mentioned -- it depends the test.  
                
> Some tests don't use the Services singleton properly
> ----------------------------------------------------
>
>                 Key: OOZIE-1114
>                 URL: https://issues.apache.org/jira/browse/OOZIE-1114
>             Project: Oozie
>          Issue Type: Bug
>    Affects Versions: trunk
>            Reporter: Robert Kanter
>            Assignee: Robert Kanter
>             Fix For: trunk
>
>
> Some of the test classes keep a reference to the Services singleton as a 
> class variable and then also re-create the Services in some of its test 
> methods.  This can cause it to not properly shut down all of the actual 
> services, which can is causing (at least some of) the flakey test failures 
> because some of those still running services interfere with some of the 
> tests.  
> The typical pattern where this issue is happening looks like this:
> {code}
> public class TestWhatever {
>      private Services services1;
>      setup() {
>           services1 = new Services();
>           services1.init();
>      }
>      testSomething() {
>           Services.get().destroy();          // destroys services1's services
>           Services services2 = new Services();     // services1 no longer 
> points to the internal singleton
>           services2.init();
>      }
>      tearDown() {
>           services1.destroy();       // does not destroy the services started 
> by services2, but does set the internal singleton to null so we've now lost 
> the only remaining reference to those services
>      }
> {code}
> You can see a concrete example of this by looking at 
> TestStatusTransitService.testCoordStatusTransitServiceSuspendedWithError
> In general, we should make sure to properly destroy the Services at the end 
> of each test

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to