[英]Java SE 7: alternative to try-catch for testing
我在测试类中有一堆从@Before beforeTest()
调用的类似方法:
//...
private void addClientDetails() {
try {
clientDetailsService.addClientDetails(testClient);
} catch (Exception e) {
}
}
private void addUserRoles() {
try {
adminController.addUserRoles(addedRoles);
} catch (Exception e) {
}
}
private void deleteAddedRoles() {
for (String role : addedRoles) {
try {
adminController.deleteUserRole(role);
} catch (Exception e) {
}
}
}
private void deleteClients() {
try {
clientsController.deleteClient(testClient.getClientId());
} catch (Exception e) {
}
}
//...
确实没有必要捕获可能的异常,并且不方便在此处添加一些if。 这些是准备测试或在测试后清理的辅助方法。
如何摆脱那些可笑的try {...} catch (...) {}
构造?
这个想法是用Runnable
参数创建一个新方法,但这会导致语法更加繁琐:
private void deleteClients() {
trySilently(new Runnable() {
@Override
public void run() {
}
});
}
private void trySilently(Runnable task) {
try {
task.run();
} catch (Exception e) {
//do nothing
}
}
在JDK 1.8方法参考中可以提供帮助。 但是就JDK 1.7而言,是否有任何漂亮的解决方案?
可以理解,忽略异常是一种不好的做法。 然而,问题恰恰是如何以一种优雅的方式做到这一点。
您可以声明这些方法引发异常,例如:
private void addClientDetails() throws Exception {
clientDetailsService.addClientDetails(testClient);
}
...然后使用反射调用它们:
String[] methods = {"addClientDetails", "addUserDetails" /*, ...*/};
for (String method : methods) {
try {
TestClass.class.getMethod(method).invoke(testObject);
}
catch (Exception e) {
// STRONGLY RECOMMEND DOING SOMETHING HERE SO YOU'RE NOT SILENTLY
// IGNORING EXCEPTIONS
}
}
(但是,如果确实要忽略adminController.deleteUserRole
异常,则由于该处理程序会循环,因此您需要将其保留在deleteAddedRoles
。)
注意 : 完全忽略那些异常似乎很奇怪。 很难想象如果您静默地忽略测试代码中的异常,如何信任测试结果。 但是我假设你知道自己在做什么... :-)
在TestNG中,用@ BeforeClass / @ BeforeMethod注释的方法不会引发异常。
你为什么不只是
@BeforeClass
private void addClientDetails() throws Exception{
clientDetailsService.addClientDetails(testClient);
}
这也适用于@Test方法。
静默捕获异常是一个非常糟糕的主意。 那你怎么能相信自己的测试呢? 您确定发生例外确实没有问题吗? 如果是,则不应首先抛出异常。
另外,您可以重新设置API以使用未经检查的异常。 只需将所有检查的异常包装在RuntimeException中,然后抛出RuntimeException。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.