使用JUnit测试异常。即使捕获了异常,测试仍然失败。

4

我是JUnit测试的新手,需要在测试异常方面得到一些提示。

我有一个简单的方法,如果输入字符串为空,则抛出异常:

public SumarniVzorec( String sumarniVzorec) throws IOException
    {
        if (sumarniVzorec == "")
        {
            IOException emptyString = new IOException("The input string is empty");
            throw emptyString;
        }

我希望测试当参数为空字符串时,异常是否被正确抛出。为此,我使用以下代码:

    @Test(expected=IOException.class)
    public void testEmptyString()
    {
        try
        {
            SumarniVzorec test = new SumarniVzorec( "");
        }
        catch (IOException e)
        {   // Error
            e.printStackTrace();
        }

结果是抛出异常,但测试失败了。 我错过了什么吗? 谢谢,Tomas
4个回答

14

移除try-catch块。JUnit将接收异常并根据您的注释进行适当处理(视为测试成功)。如果抑制异常,则无法确定它是否被JUnit抛出。

@Test(expected=IOException.class)
public void testEmptyString() throws IOException {
    new SumarniVzorec( "");
}
此外,Dr. Jerry 正确指出,您不能使用 == 运算符来比较字符串。请使用 equals 方法(或 string.length == 0)。参见'Expected Exceptions' 部分。

1
谢谢,但我已经尝试过了,它会出现错误:未处理的异常类型IOError。 - Tomas Novotny
2
你仍然需要声明该方法为 throws IOException - developmentalinsanity
@Tomas,你从哪里得到IOError?你能发布完整的错误消息(包括堆栈跟踪)吗? - Nikita Rybak
@developmentalinsanity 谢谢,是我的错。但如果不这样编译,它就无法解决 IOError 问题。 - Nikita Rybak

1

也许应该使用 sumarniVzorec.equals("") 而不是 sumarniVzorec == ""


谢谢,我修复了它,但它并没有解决上述问题。 - Tomas Novotny

0

另一种方法是:

public void testEmptyString()
{
    try
    {
        SumarniVzorec test = new SumarniVzorec( "");
        assertTrue(false);

    }
    catch (IOException e)
    {
       assertTrue(true);
    }

0
怎么样:
@Test
public void testEmptyString()
{
    try
    {
        SumarniVzorec test = new SumarniVzorec( "");
        org.junit.Assert.fail();
    }
    catch (IOException e)
    {   // Error
        e.printStackTrace();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接