初级 ADT 和 JUnit 4

Beginner ADT's and JUnit 4

我正在制作一个简单的 ADT,它有一个方法 (Add3),可以将 3 加到给定的 int 上。代码如下所示:

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);
    }
}

当我 运行 测试 class 它失败了,但我不确定为什么。如果我在 运行 测试之前打印两个值(预期和结果),它们都会打印 5。

我对 JUnit 和 ADT 比较陌生,所以我不太确定我是否做对了。我将尝试在 JUnit 上找到一些教程视频,看看我是否能找到解决方案。如有任何帮助,我们将不胜感激!

您没有在 TestADT 中覆盖 equalshashcode。默认情况下,equals 是通过引用完成的。这意味着它正在检查第一个是否与第二个 instance 相同。

您需要覆盖 equalshashcode 并让它们通过 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 放入 SetMap 并期望它正常工作,则需要实施这些方法。

修复代码的最快方法是使用:

@Test
public void test() 
{
    TestADT result = TestADT.add3(test);
    assertEquals(expected.toString(), result.toString());
}

最佳做法是对方法名称使用小写字母:http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html