Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 初学者ADT';s和JUnit 4_Java_Junit_Abstract Data Type - Fatal编程技术网

Java 初学者ADT';s和JUnit 4

Java 初学者ADT';s和JUnit 4,java,junit,abstract-data-type,Java,Junit,Abstract Data Type,我正在制作一个简单的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); retu

我正在制作一个简单的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);
    }
}
当我运行测试类时,它失败了,但我不确定为什么。如果在运行测试之前打印两个值(预期值和结果),它们都打印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
放入
集合
映射
并期望其正常工作,则需要实现这些方法。

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

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

最佳做法是对方法名称使用小写:

您能解释一下重写equals和hashcode是什么意思吗?非常感谢,最初我打算使用@azbarcea的方法,但经过一点审查和更多测试,我了解您的解决方案,并了解它在一个例外情况下的工作原理,
hashCode
方法做什么?@PaulWarnick它做了一些非常计算机科学的事情。我得写一篇博客文章给你解释一下。嗨@PaulWarnick,我是为你写这篇文章的,希望能对你有所帮助!非常感谢。我只是碰巧现在正在研究哈希代码,所以时机很好。