0

这就是我所拥有的:

@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

4 回答 4

2

sendMessage如果不修改方法,您将无法做到这一点。例如,如果您在此处捕获异常但选择忽略它并仅返回一些值,则方法之外的代码不知道它。您可以通过重构以下代码来解决此问题object:将处理异常的代码移至名为 eg 的单独方法handleException。然后,在您的测试中,您可以创建一个子类,在该子类中handleException执行handleException超类的原始内容,但另外设置一些您将能够在测试中读取的标志,并以此方式告诉异常被抛出。但是,如果你不能修改object' 类的代码,恐怕你就不走运了。

于 2013-10-17T09:20:53.063 回答
2

据我所知,JUnit 无法实现您正在寻找的东西。

如果您真的想对此进行测试,您可以将有关异常的一些信息存储在 catch 块中,并在 sendMessage() 方法中处理它。

在我看来,更好的选择可能是测试对象的输出或状态。如果状态/输出与未发生异常时完全相同,那么测试它的意义何在?你有一个过于宽泛的捕获块吗?

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

于 2013-10-17T09:27:40.907 回答
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.classover Exception.class

于 2013-10-17T09:19:55.783 回答
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();
}
于 2013-10-17T09:15:30.790 回答