你有两个分支要测试:
-
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());
}