初学者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中的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并希望其正常工作,则需要实施这些方法。

+0

你能解释的忽略equals你的意思是什么,哈希码? – 2015-02-06 00:21:00

+0

@PaulWarnick请参阅我的编辑 – 2015-02-06 00:43:35

+1

非常感谢您,最初我打算使用@ azbarcea的方法,但经过一些审查和更多测试,我了解您的解决方案并了解它如何与一个异常协同工作,hashCode '方法呢? – 2015-02-06 01:38:01

解决您的代码的最快方法是使用:

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

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