繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM