我在测试类中有一堆从@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) {
}
}
//...
实际上没有必要捕获可能的异常并且不方便在这里添加一些ifs。这些是在测试后准备测试或清理的辅助方法。
如何摆脱那些荒谬的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而言是否有任何漂亮的解决方案?
据了解,忽略例外是一种不好的做法。然而问题是如何以优雅的方式做到这一点。
答案 0 :(得分:1)
您可以声明这些方法会抛出异常,例如:
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
}
}
(您需要将处理程序保留在deleteAddedRoles
中,因为它会循环,如果确实想要忽略来自adminController.deleteUserRole
的异常。)
注意:完全忽略这些异常似乎很奇怪。如果您默默地忽略测试代码中的异常,很难想象如何信任您的测试结果。但我假设你知道你在做什么......: - )
答案 1 :(得分:1)
在TestNG中,使用@ BeforeClass / @ BeforeMethod注释到抛出异常的方法没有问题。
为什么你不能
@BeforeClass
private void addClientDetails() throws Exception{
clientDetailsService.addClientDetails(testClient);
}
这也适用于@Test方法。
Silenty捕获异常是非常糟糕的主意。你怎么能相信你的测试呢?你确定发生的例外确实没问题吗?如果是,则不应该首先抛出异常。
此外,您可以重新设置API以使用未经检查的例外。只需在RuntimeException中包装任何已检查的异常,并抛出RuntimeException。