Java JUnit测试未通过

时间:2018-01-16 10:03:26

标签: java testing junit

如果名称与正则表达式匹配,我有一个必须返回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));
}

2 个答案:

答案 0 :(得分:4)

您的方法返回boolean,这是一种只允许值为truefalse的基本类型。它不允许null,因此assertNull()的测试永远不会有效!

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

在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不仅会匹配空格,还会匹配标签,换行符,回车等。所以请确保这就是你想要的。

答案 1 :(得分:-1)

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

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进行测试