为返回对象的方法编写junit测试

时间:2018-04-20 05:28:19

标签: java junit junit4

我是编写junit测试的新手。我坚持如何为返回对象的方法编写测试。我经历了这个question,但我不相信。我无法对方法进行更改。我想为这个方法编写一个测试:

public final class Demo{
      public Test getTestObject() {
            return this.testObject== null ? Test.getDefaultInstance() : this.testObject;
        }
}

Test Class:
public final Test{
private Test()
{
}
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以为Test对象实现一个好的equals方法,并在单元测试中使用它。 我写了一个示例代码。

public class Foo
{

  int a = 0;
  int b = 0;
  String c = "";

  public Foo(int a, int b, String c)
  {
    this.a = a;
    this.b = b;
    this.c = c;
  }

  public static Foo getDefaultInstance()
  {
    return new Foo(1, 1, "test");
  }

  @Override
  public boolean equals(Object o){
    if (o == this) return true;
    if (!(o instanceof Foo)) {
        return false;
    }

    Foo foo = (Foo) o;

    return foo.a== a &&
        foo.b == b &&
            foo.c.equalsIgnoreCase(c);
  }

  @Override
  public int hashCode() {
      int result = 17;
      result = 31 * result + a;
      result = 31 * result + b;
      result = 31 * result + c.hashCode();
      return result;
  }

}

此类包含我们需要测试的方法。

public class Other
{
  Foo foo;

  public Foo getFoo()
  {
    return this.foo == null ? Foo.getDefaultInstance() : this.foo;
  }

}

这是带有测试方法的类。

import org.junit.Test;
import static org.junit.Assert.*;

public class MyTest
{
  @Test
  public void testGetFoo() {
     Other other = new Other();
     Foo foo = other.getFoo();
     assertEquals(foo, new Foo(1, 1, "test"));

  }
}

答案 1 :(得分:0)

你有两个分支要测试:

  • testObject字段引用非null对象,因此返回
  • testObject字段引用null,因此您可以使用getDefaultInstance()方法创建它。

因此,您可以定义两个测试方法来测试每个方案,并声明返回了预期的Test实例。

请注意,通常不应重写equals()/ hashCode()以使单元测试工作 实际上,如果Test.getDefaultInstance()每次都返回相同的实例。您只需要比较两个Test对象引用 JUnit的Assert.assertSame(Object o1, Object o2)允许声明o1==o2足够:

假设要测试的类是Foo

@Test
public void getTestObject_as_null(){
   Foo foo = new Foo();
   Assert.assertSame(Test.getDefaultInstance(), foo.getTestObject());
}

@Test
public void getTestObject_as_not_null(){
   Foo foo = new Foo();
   Test test = new Test(...);
   foo.setTestObject(test);
   Assert.assertSame(test, foo.getTestObject());
}

它也可以与Assert.assertEquals()一起使用,但Assert.assertSame()更好地传达了我们想要断言的意图:引用。

相反,如果Test.getDefaultInstance()在每次调用时返回不同的实例,则应比较返回的Test实例的内容。
测试看起来像:

@Test
public void getTestObject_as_null(){
   Foo foo = new Foo();
   Test expectedTest = Test.getDefaultInstance();
   Test actualTest = foo.getTestObject();
   Assert.assertEquals(expectedTest.getX(), actualTest.getX());
   Assert.assertEquals(expectedTest.getY(), actualTest.getY());
}

并且该测试不需要像getTestObject()所引用的对象那样进行更改,并且预期的Test对象与将其作为fixture传递一样是必要的:

@Test
public void getTestObject_as_not_null(){
   Foo foo = new Foo();
   Test test = new Test(...);
   foo.setTestObject(test);
   Assert.assertSame(test, foo.getTestObject());
}