Re: state of an object in setUp() of junit TestCase
You answered your own question, so I will just address some side issues.
jimgardener wrote:
If I forget to define a tearDown() method ,will an object initialized
in setUp() maintain its state in between two test methods?
suppose I am testing a Stopwatch class
<code>
public class Stopwatch {
public long startTime=0;
These are the default values. Explicitly setting them in member
initialization causes them to be set twice. In the case of 'startTime' and
'isrunning' [sic] you don't even use the initial value, so why bother setting it?
public long stopTime=0;
boolean isrunning=false;
The variable name 'isrunning' violates the naming conventions.
public void start(){
startTime=System.currentTimeMillis();
isrunning=true;
}
public void stop(){
if (isrunning) stopTime=System.currentTimeMillis();
This 'if' block violates the coding conventions.
isrunning=false;
}
public long getTotalDurationMilliSeconds(){
long duration=0;
You never use the '0' value, so why do you set it? Just so you can discard it?
if( isrunning){
duration=(System.currentTimeMillis()-startTime);
}
else{
duration=stopTime-startTime;
}
return duration;
}
public void reset(){
startTime=0;
stopTime=0;
isrunning=false;
}
public long getTotalDurationSeconds(){
long duration=0;
Again, why did you initialize 'duration' to a value that is immediately discarded?
if( isrunning){
duration=((System.currentTimeMillis()-startTime)/1000);
}
else{
duration=(stopTime-startTime)/1000;
}
return duration;
}
}
</code>
I have a testcase like below,in which I have a setUp() but no
tearDown()
<code>
class StopwatchTest extends TestCase{
How come you aren't using '@Test'?
private Stopwatch watch;
public StopwatchTest(String name){
super(name);
}
public void setUp(){
watch=new Stopwatch();
}
private void sleepForSomeTime(long timeinmillisecs){
The variable name 'timeinmillisecs' egregiously violates the naming standards.
try{
System.out.println("sleeping for :"+(timeinmillisecs/1000)+"secs");
'System.out.println()'? Really? Come on.
If it's important enough to log, it's important enough to log correctly.
If you really are such a schlemiel that you have to use a
'System.X.println()', use 'System.err' at least. But really, use a logger.
Thread.sleep(timeinmillisecs);
}catch(InterruptedException e){
}
}
public void testNormalOpButForgottToStop(){
watch.start();
sleepForSomeTime(3000);
//watch is not stopped;
assertEquals(3,watch.getTotalDurationSeconds());
}
This is not a valid test. Since the watch is not stopped and sleep times are
approximate, you have a small risk that this assertion will fail even with
correct code.
The granularity of one second will make this rare, but not theoretically
impossible. You should comment your code that you depend on the granularity
to avoid trouble.
public void testStoppedBeforeStart(){
System.out.println("timeduration:"+watch.getTotalDurationSeconds());
sleepForSomeTime(2000);
watch.stop();
System.out.println("timeduration:"+watch.getTotalDurationSeconds());
assertEquals(0,watch.getTotalDurationSeconds());
}
}
</code>
It seems that the watch is initialized each time before running the
test methods.Is this the expected behaviour?
--
Lew