Friday, September 21, 2012

Unit Testing Java code using mock objects (mockito)

Let's start with an example. We have a Conversion class to convert temperature from Fahrenheit to Celcius.

Following is the Java code :
class Fahrenheit {
 float f=0;
 public Fahrenheit(float f)
 {
  this.f=f;
 }
 public float getFahrenheit()
 {
  return f;
 }
 public void setFahrenheit(float f)
 {
  this.f=f;
 }
}

class Celcius {
 float celcius=0;
 public Celcius(Float c)
 {
  System.out.println("Celcius="+c);
  celcius=c;
 }
 public Float getCelcius()
 {
  return celcius;
 }

 public void setCelcius(Float c)
 {
  System.out.println("Celcius="+c);
  celcius=c;
 }
}

public class Convert {
 
 private float convertToFahrenheit(Celcius c)
 {
  return (float) ((c.getCelcius()*1.8)+32);
 }
 private float converToCelcius(Fahrenheit f)
 {

  return ((f.getFahrenheit()-32)*5/9);
 }

 public float convert(Fahrenheit f, Celcius c)
 {
  if(f!=null)
   return converToCelcius(f);
  else
   return convertToFahrenheit(c);
 }

}

1.Create Mock Objects
Object obj=mock(SomeclassName.class)

2. Setup return values on this object
when(obj.somemethod(param)).thenReturn(100);

3. Call a method under test
obj.aMethod()

4. Verify if a particular method is called and returns a certain value
verify(obj).bMethod(abc,anyObject());

For our example above, the test code looks like below

 @Test
 public void test() {

  Convert conversion = mock(Convert.class);
  Celcius celcius=mock(Celcius.class);
  Fahrenheit fahrenheit=mock(Fahrenheit.class);
  when(celcius.getCelcius()).thenReturn((float) 20.0);


  float val=conversion.convert(fahrenheit,celcius);

  verify(conversion).convertToFahrenheit(celcius);
 }

No comments: