【问题标题】:Java Junit failing when expected and actual are the same?Java Junit在预期和实际情况下失败是一样的吗?
【发布时间】:2019-09-20 08:37:30
【问题描述】:

我已经完成了一个我一直在从事的大项目。我通常在没有 Junit 的情况下进行自己的测试,但我的要求是现在使用它。我要测试的所有方法都是无效的,不返回任何内容,而是根据某些因素打印信息。所以,我需要使用 Junit 的 assertEquals 方法测试这些。

例如:

public void addContact(String firstName,String lastName,Person p) {
       String key = firstName.substring(0,1).toUpperCase() + firstName.substring(1).toLowerCase() + " ".concat(lastName.substring(0,1).toUpperCase() + lastName.substring(1).toLowerCase());
    if(hasContact(key)){
        System.out.println("\nCannot add user. User already exists. Try adding distinct name to diffentiate between users with the same name");
    }
    else{
       this.contacts.put(key,p);
       System.out.println("\nUser: " + key + " Successfully added");
    }
    }

这是我想从我的 AddressBook 类中测试的 void 方法之一,目前,我正在测试是否可以添加用户,因此它应该打印 \nUser: " + key + " Successfully added 它确实如此。

在我的 JUNIT 测试课程中,我正在尝试这样检查...

@Test
    public void addContact(){
         final ByteArrayOutputStream outContent = new ByteArrayOutputStream();



         Address a1 = new Address("grove","Waterford","Waterford","x9123r","0987654321");
        Person p1 = new Person("Charlie","Ansell",a1);
        System.setOut(new PrintStream(outContent));
        ad1.addContact("Charlie","Ansell", p1);
        assertEquals("User: Charlie Ansell Successfully added", outContent.toString());


    }

Junit 的输出是:expected:<[User: Charlie Ansell Successfully added]> but was <[User: Charlie Ansell Successfully added]>

我的问题是,如果它们显示相同的输出,为什么会失败?

【问题讨论】:

  • 仅仅因为它们看起来相同并不意味着它们实际上是相同的。有些字符看起来像其他字符。有些字符是不可见的。

标签: java junit


【解决方案1】:

您是否尝试过调试它并查看差异?
我的猜测 - 在开头(来自您的代码)和结尾(您正在使用println)都缺少\n

这应该有效: assertEquals("\nUser: Charlie Ansell 添加成功\n", outContent.toString());

【讨论】:

  • 嗨,尼尔。不幸的是,这也失败了,我已经调试过了,它看起来一样
  • 'looks' 没有多说。 equals() 的结果是什么? trim().equals() 的结果是什么?
【解决方案2】:

尽管内容看起来很相似,但您的程序中有额外的换行符 (\n),而您的测试中没有包含这些换行符。

替换:

assertEquals("用户:Charlie Ansell 添加成功", outContent.toString());

与:

assertEquals("\nUser: Charlie Ansell 成功添加\n", outContent.toString());

【讨论】:

  • 是的,你也错过了最后的换行符。我的测试通过了
  • 没有使用.trim我刚刚发布了一个答案,我必须修剪两个对象才能通过测试
【解决方案3】:

好的,所以我刚刚找到了答案。

我在预期对象和实际对象的末尾添加了.trim() 函数。所以我的新代码如下所示:

@Test
public void addContact(){
     final ByteArrayOutputStream outContent = new ByteArrayOutputStream();



     Address a1 = new Address("grove","Waterford","Waterford","x9123r","0987654321");
    Person p1 = new Person("Charlie","Ansell",a1);
    System.setOut(new PrintStream(outContent));
    ad1.addContact("Charlie","Ansell", p1);
    assertEquals("\nUser: Charlie Ansell Successfully added\n".trim(), outContent.toString().trim());


}

我的假设是两个输出中都有空格,感谢所有评论的人,感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 2020-06-12
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2011-02-14
    相关资源
    最近更新 更多