【问题标题】:Java JUnit test does not passJava JUnit 测试未通过
【发布时间】:2018-01-16 10:03:26
【问题描述】:

如果名称与正则表达式匹配,我有一个方法必须返回 true,如果名称包含特殊字符或数字,则返回 null。

这是方法:

@SuppressWarnings("null")
public boolean containsSpecialCharacters(String text) {
    Pattern p = Pattern.compile("/^[a-zA-Z\\s]+$/");
    //check if the name has special characters
    Matcher m = p.matcher(text);
    boolean b = m.find();
    //cast the null to boolean
    Boolean boolean1 = (Boolean) null;
    if (m.matches()) {
        return true;
    }
    else {
        return boolean1;
    }    
}

这是对不能通过的方法的测试:

@Test
public void parseBeanCheck() throws NumberFormatException, IOException, SAXException, IntrospectionException {

    IngenicoForwardingHelper helper = new IngenicoForwardingHelper();

    String test1 = "Steve Jobs";
    Assert.assertTrue(helper.containsSpecialCharacters(test1));
    //This should return Null 
    String test2 = "Steve Jobs1";
    Assert.assertNull(helper.containsSpecialCharacters(test2));
    //This should return Null 
    String test3 = "Steve Jöbs";
    Assert.assertNull(helper.containsSpecialCharacters(test3));
}

【问题讨论】:

  • 究竟是什么失败了?这应该怎么做? //将 null 转换为 boolean Boolean boolean1 = (Boolean) null;
  • 或者更确切地说,返回 m.matches();
  • @JackFlamp 我感觉那个测试应该会失败
  • @Antony 您的方法似乎不太可能(能够)返回 null。
  • 也许让您的返回类型为Boolean 而不是boolean,对于true 使用Boolean.TRUE。但我同意@Berger 的观点,为什么你要返回null 而不是false

标签: java testing junit


【解决方案1】:

您的方法返回一个boolean,它是一个原始类型,只允许truefalse 的值。它不允许null,因此您对assertNull() 的测试将永远无法工作!

您可以更改方法签名以返回 Boolean,但如果可能的话,通常最好避免从方法返回 null。无论如何,返回 truefalse 比返回 truenull 更有意义。

在 Java 中,您的正则表达式不需要(也不应该有)开头和结尾的斜线。

你可以把你的代码改成这样:

public boolean containsSpecialCharacters(String text) {
    Pattern p = Pattern.compile("^[a-zA-Z\\s]+$");
    Matcher m = p.matcher(text);
    return !m.matches();
}

或者更简单:

public boolean containsSpecialCharacters(String text) {
    return !text.matches("[a-zA-Z\\s]+");
}

而测试是这样的:

@Test
public void parseBeanCheck() throws NumberFormatException, IOException, SAXException, IntrospectionException {

    IngenicoForwardingHelper helper = new IngenicoForwardingHelper();
    Assert.assertFalse(helper.containsSpecialCharacters("Steve Jobs"));
    Assert.assertTrue(helper.containsSpecialCharacters("Steve Jobs1"));
    Assert.assertTrue(helper.containsSpecialCharacters("Steve Jöbs"));
}    

还值得一提的是,\s 不仅会匹配空格,还会匹配制表符、换行符、回车符等。所以请确保这是您想要的。

【讨论】:

  • 我怎样才能让它也接受“-”?这是模式 p = Pattern.compile("^([A-Z][a-z]*((\\s)))+[A-Z][a-z]*$");我也想接受:例如:Martin Harry-Potter 如何在此处添加?
  • 通常希望您在 Stack Overflow 上提出一个全新的问题,而不是添加 cmets 提出新问题。这样一来,问题就更有针对性,而且你也会获得更多分数。
  • 抱歉
【解决方案2】:

您可能应该将您的特殊字符检查简化为:

public boolean containsSpecialCharacters(String text) {
    Pattern p = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(text);
    return m.find();
}

并使用Assert.assertTrueAssert.assertFalse 进行测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2011-05-19
    相关资源
    最近更新 更多