是否可以使用JUnit监视已处理的异常?

时间:2013-10-17 09:04:42

标签: java unit-testing junit

这就是我所拥有的:

@Test
public testSendMessageToStub() {
    // under the hood sends message
    // if exception occurrs
    // it will be catched and message will be put on retry
    object.sendMessage(); 
}

如果发生异常但是在sendMessage()方法的catch块中处理了,是否有任何方法可以将测试标记为失败?

由于

编辑:看起来我过于关注这些遗留测试及其使用方式,完全错过了sendMessage返回状态代码响应(!!!)的事实。所以现在我只是声明状态代码,可以将这些测试扩展到更详细的场景并在jenkins上旋转它们。我想避免回答以前如何检查这些测试。在阅读了Plux的答案之后,我想到了检查状态代码的想法。谢谢!

4 个答案:

答案 0 :(得分:2)

如果不修改sendMessage方法,则无法执行此操作。例如,如果您在那里捕获异常,但选择忽略它并返回一些值,则该方法之外的代码不知道它。您可以通过重构object的代码来解决这个问题:将处理异常的代码移动到一个单独的方法,例如, handleException。然后,在您的测试中,您可以创建一个子类,handleException将从超类中执行原始handleException,但另外设置一些您可以在测试中读取的标志,并以这种方式告诉异常被抛出。但是,如果你不能修改object课程的代码,我恐怕你运气不好。

答案 1 :(得分:2)

就我所知,JUnit确实无法找到你正在寻找的东西。

如果你真的想要测试它,你可以在catchMlock中存储一些关于异常的信息,在sendMessage()方法中处理它。

在我看来,更好的选择可能是测试对象的输出或状态。如果状态/输出与未发生异常时完全相同,那么测试点是什么?你有一个过于广泛的陷阱吗?

编辑:对于AdityaTS,我没有足够的声誉评论帖子,但我的评论:你还没有提供所有代码,所以我不能肯定地说,但我的猜测是它的Logger.getLogger IN强制转换ClassNotFoundException的catch-block。 (或者是loadConnectionInfo())请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/ClassNotFoundException.html

答案 2 :(得分:0)

sendMessage()类中生成的异常将在测试方法中可用。在sendMessage()方法周围添加一个try catch块,如下所示

@Test
public testSendMessageToStub() {

    try
       {
        object.sendMehssage(); 
       }
    catch(Excpetion e)  //Use more specific exception type if you know
       {
        fail(e.getMessage());
       }
}

我在我的代码中试过这个。它对我有用。让我知道。

public DBConnectionInfo connectionInit()
{

    loadConnectionInfo();

    try
    {
        Class.forName(dbObject.getDriver());
    } catch (Exception e)
    {
        Logger lgr = Logger.getLogger(PostgreLocationManager.class.getName());
        lgr.log(Level.SEVERE, e.getMessage(), e);
    }

    try
    {
        dbObject.setConnection(DriverManager.getConnection(dbObject.getDatabaseURL(), dbObject.getUserName(),
                dbObject.getPassword()));
    } catch (Exception e)
    {
        Logger lgr = Logger.getLogger(PostgreLocationManager.class.getName());
        lgr.log(Level.SEVERE, e.getMessage(), e);
    }
    return dbObject;
}

上述课程的测试用例。

@Test
public void testDriverFailure()
{
    when(dbModelObject.getDriver()).thenReturn("driver");
    when(dbModelObject.getDatabaseURL()).thenReturn("jdbc:postgresql://127.0.0.1:5432/testdb");
    when(dbModelObject.getUserName()).thenReturn("postgres");
    when(dbModelObject.getPassword()).thenReturn("postgres");

    try
    {
        dbConnector.connectionInit();
    } catch (Exception e)
    {
        assertTrue(e instanceof ClassNotFoundException);
    }

    verify(dbModelObject).getDriver();
}

答案 3 :(得分:0)

所以你希望异常传播出sendMessage()方法,对吗?

这是编写测试的另一种方法,用于验证您希望抛出的异常。

@Test (expected = MyExpectedException.class)
public testSendMessageToStub() {
    // under the hood sends message
    // if exception occurrs
    // it will be catched and message will be put on retry
    object.sendMessage(); 
}

通常最好尽可能具体(例如MyExpectedException.class超过Exception.class