初学者ADT和JUnit 4
问题描述:
我正在做一个简单的ADT,它有一个方法(Add3),它将3添加到给定的int中。代码如下所示:初学者ADT和JUnit 4
public class TestADT
{
private final int x;
public TestADT (int x)
{
this.x = x;
}
public static TestADT Add3(TestADT num)
{
int ex = (num.x + 3);
return (new TestADT(ex));
}
public String toString()
{
return(x + "");
}
public static void main(String[] args)
{
TestADT test = new TestADT(2);
System.out.println(Add3(test));
}
}
我试图做的是创建一个JUnit测试,以检查ADD3方法是否正常工作,到目前为止,我有这样的:
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class Add3Test
{
private TestADT test;
private TestADT expected;
@Before
public void setUp() throws Exception
{
test = new TestADT(2);
expected = new TestADT(5);
}
@Test
public void test()
{
TestADT result = TestADT.Add3(test);
assertEquals(expected, result);
}
}
当我运行测试类失败,但我不确定原因。如果我在运行测试之前打印两个值(预期为&结果),则它们都会打印5.
我对JUnit和ADT比较陌生,所以我不太确定我是否正在做这项权利。我将尝试在JUnit上找到一些教程视频,看看我能否找出解决方案。任何帮助,将不胜感激!
答
您还未覆盖您的TestADT
中的equals
和hashcode
。默认情况下,equals
是通过引用完成的。这意味着它正在检查第一个是否与第二个是相同的实例。
你需要重写equals
和hashcode
并让他们通过自己的x
比较,以检查是否相等:
public class TestADT
{
private final int x;
public TestADT(int x)
{
this.x = x;
}
public static TestADT Add3(TestADT num)
{
int ex = (num.x + 3);
return (new TestADT(ex));
}
public String toString()
{
return(x + "");
}
public static void main(String[] args)
{
TestADT test = new TestADT(2);
System.out.println(Add3(test));
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TestADT testADT = (TestADT) o;
if (x != testADT.x) return false;
return true;
}
@Override
public int hashCode() {
return x;
}
}
在我看来,这是比@ azbarcea的一个更好的解决方案。如果您想将TestADT
放入Set
或Map
并希望其正常工作,则需要实施这些方法。
答
解决您的代码的最快方法是使用:
@Test
public void test()
{
TestADT result = TestADT.add3(test);
assertEquals(expected.toString(), result.toString());
}
最佳做法是使用小写的方法名:http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
你能解释的忽略equals你的意思是什么,哈希码? – 2015-02-06 00:21:00
@PaulWarnick请参阅我的编辑 – 2015-02-06 00:43:35
非常感谢您,最初我打算使用@ azbarcea的方法,但经过一些审查和更多测试,我了解您的解决方案并了解它如何与一个异常协同工作,hashCode '方法呢? – 2015-02-06 01:38:01