【问题标题】:Beginner ADT's and JUnit 4初学者 ADT 和 JUnit 4
【发布时间】:2015-02-06 00:08:23
【问题描述】:

我正在制作一个简单的 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 上查找一些教程视频,看看是否能找到解决方案。任何帮助将不胜感激!

【问题讨论】:

    标签: java junit abstract-data-type


    【解决方案1】:

    您尚未在您的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 并希望它能够正常工作,则需要实现这些方法。

    【讨论】:

    • 你能解释一下覆盖等于和哈希码的意思吗?
    • 非常感谢,最初我打算使用@azbarcea 的方法,但经过一些审查和更多测试后,我了解您的解决方案,并了解它是如何工作的,有一个例外,@ 987654333@方法呢?
    • @PaulWarnick 它做了一些非常计算机科学的事情。我得写一篇博文给你解释一下。
    • 嗨@PaulWarnick 我为你写了这篇文章,希望对你有帮助! sleepeasysoftware.com/heres-what-javas-hashcode-does
    • 谢谢!我只是碰巧现在正在研究哈希码,所以时机恰到好处。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2023-03-27
      • 1970-01-01
      • 2015-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多