【问题标题】:Writing junit test for a method returning object为方法返回对象编写junit测试
【发布时间】:2018-04-20 05:28:18
【问题描述】:

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: java junit junit4


    【解决方案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"));
    
      }
    }
    

    【讨论】:

    • 你能举个例子吗?我是新手。
    【解决方案2】:

    你有两个分支要测试:

    • testObject 字段引用了一个非空对象,所以它被返回了
    • 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 对象是必要的,就像您将它作为夹具传递一样:

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

    【讨论】:

    • Foo foo = new Foo(); Assert.assertSame(Test.getDefaultInstance(), foo.getTestObject());你能解释一下吗? foo 是我要测试的类吗?如果是这样,那么 Test 是什么?对不起,我有点困惑。
    • 当然!在您的问题中,您没有指定要测试的方法的类。所以我把它命名为:FooTest 是您的测试方法返回的类型:public Test getTestObject()。 `
    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2023-02-17
    相关资源
    最近更新 更多