Java SE 7:try-catch的替代测试

时间:2016-11-24 12:32:16

标签: java junit try-catch

我在测试类中有一堆从@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而言是否有任何漂亮的解决方案?

据了解,忽略例外是一种不好的做法。然而问题是如何以优雅的方式做到这一点。

2 个答案:

答案 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。