UnitTest显示测试失败,而预期结果和实际结果相同

时间:2014-07-16 12:48:22

标签: java junit

我正在学习JUnit,我正在测试一个简单的方法,我有一个填充列表并返回它的方法。虽然在单元测试中我提供了相同的列表,但是单元测试失败了。

代码

public List<Transaction> retrieveData() throws ParseException {
        List<Transaction> expResult = new ArrayList();
        Date convertedDate = new SimpleDateFormat("yyyy-MM-dd").parse("2014-04-29T13:15:54");
        Transaction tran = new Transaction("A", convertedDate,new BigDecimal("20.00"));
        expResult.add(tran);
        tran = new Transaction("B", convertedDate,new BigDecimal("20.00"));
        expResult.add(tran);
        tran = new Transaction("A", convertedDate,new BigDecimal("20.00"));
        expResult.add(tran);
        tran = new Transaction("B", convertedDate,new BigDecimal("20.00"));
        expResult.add(tran);
        return expResult;

    }

JUnit的

@Test
public void testRetrieveData() throws ParseException {
    MyClass instance = new MyClass();
    List<Transaction> expResult = new ArrayList();
    Date convertedDate = new SimpleDateFormat("yyyy-MM-dd").parse("2014-04-29T13:15:54");
    Transaction tran = new Transaction("A", convertedDate,new BigDecimal("20.00"));
    expResult.add(tran);
    tran = new Transaction("B", convertedDate,new BigDecimal("20.00"));
    expResult.add(tran);
    tran = new Transaction("A", convertedDate,new BigDecimal("20.00"));
    expResult.add(tran);
    tran = new Transaction("B", convertedDate,new BigDecimal("20.00"));
    expResult.add(tran);

    List<Transaction> result = instance.retrieveData();
    assertEquals(expResult, result);

}

失败的消息和堆栈跟踪如下

错误

expected: java.util.ArrayList<[
   Transaction{cardNumber=A, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}, 
   Transaction{cardNumber=B, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}, 
   Transaction{cardNumber=A, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}, 
   Transaction{cardNumber=B, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}]> 
   but was: java.util.ArrayList<[
   Transaction{cardNumber=A, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}, 
   Transaction{cardNumber=B, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}, 
   Transaction{cardNumber=A, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}, 
   Transaction{cardNumber=B, timestamp=Tue Apr 29 00:00:00 EST 2014, price=20.00}]>
java.lang.AssertionError
    at org.junit.Assert.fail(Assert.java:93)
    at org.junit.Assert.failNotEquals(Assert.java:647)
    at org.junit.Assert.assertEquals(Assert.java:128)
    at org.junit.Assert.assertEquals(Assert.java:147)

2 个答案:

答案 0 :(得分:1)

比较列表时,您的测试是断言列表是等于,这将在列表中的所有元素上调用equals()

所有类的equals的默认实现只是断言对象字面上是相同的(相同的指针)。

如果覆盖equals()类中的Transaction来检查类保留的值而不是引用,则测试将按预期运行。

答案 1 :(得分:0)

这是一个关于类似问题的讨论和彻底的答案:

How can I check if two ArrayList differ, I don't care what's changed