这就是我所拥有的:
@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的答案之后,我想到了检查状态代码的想法。谢谢!答案 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
)