我是编写junit测试的新手。我坚持如何为返回对象的方法编写测试。我经历了这个question,但我不相信。我无法对方法进行更改。我想为这个方法编写一个测试:
public final class Demo{
public Test getTestObject() {
return this.testObject== null ? Test.getDefaultInstance() : this.testObject;
}
}
Test Class:
public final Test{
private Test()
{
}
}
感谢您的帮助。
答案 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());
}