有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java初学者ADT和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);
    }
}

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

我是JUnit和ADT的新手,所以我不太确定我是否做得对。我将尝试查找一些关于JUnit的教程视频,看看是否能找到解决方案。任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    您尚未在TestADT中重写equalshashcode。默认情况下,equals是通过引用完成的。这意味着它正在检查第一个实例是否与第二个实例相同

    您需要重写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并期望它正常工作,则需要实现这些方法