Re: help: enum cause failure in multi thread run
www wrote:
I hope to add one more question to help me understand better: I have
two junit tests (in Eclipse, on Linux). Each junit test runs the same
Java program from the beginning to the end with different input data
and generates different output data. If I run the two tests in a row,
the second test fails. The cause of 2nd junit test failing is that
ABC_NUM values were modified by the 1st junit test and be picked up by
the second test which is the wrong value for the 2nd test. If I run
one test each time, every test passes. Or, at the beginning of my Java
program, if I add this line:
ABC_ENUM.reSetToDefaultValues(); //refresh, get rid of the values by
previous run
I can run the 2 tests in a row and every test passes. It seems Eclipse
stores ABC_ENUM in a buffer or somewhere. If two junit tests run in a
I'll bet this "buffer or somewhere" is an instance variable of your test
class, yes? If so, it's not Eclipse storing it, it's your own code.
row, the second test just access that SAME ABC_ENUM left over by the
1st run.
Is this Eclipse's feature/bug?
No, it's yours.
Consider using 'setUp()' and 'tearDown()' to, well, set up and tear down your
test scenarios. Those methods are run before and after (respectively) each
test method of the class, let alone successive runs of the same test-class
instance.
public class FooTest
{
private final Logger logger = getLogger( getClass() );
private Foo foo; // for some reason, use member var
/**
* Set up the test.
*/
@Before
public void setUp()
{
logger.debug( "Set up the test." );
foo = new Foo();
}
/**
* Tear down the test.
*/
@After
public void tearDown()
{
logger.debug( "Tear down the test." );
foo = null;
}
/**
* Test of getHandle method, of class Person.
*/
@Test
public void testDoSomething()
{
Bar bar = foo.doSomething();
assertNotNull( bar );
}
}
Naturally you'll add test-case setup and teardown code to flesh out those methods.
BTW, setting up an instance variable is maybe a bad thing; better to create a
local 'Foo foo' inside each 'testX()' method, perhaps. That depends on the
nature of your test scenarios.
--
Lew