gpt4 book ai didi

java - 编写高效且无冗余的测试

转载 作者:行者123 更新时间:2023-11-28 20:02:03 24 4
gpt4 key购买 nike

首先,我使用 Scala,但任何 Java 方法都可能有效。

我有一个带有数据库连接的应用程序,我想在不修改数据库或数据库离线的情况下运行我的测试和开发我的应用程序。

比如说,我有一个连接到数据库的大类(或模块),做所有您想做的事情,我如何从外部访问该类或其参数?

例如,如果我希望类正常运行而不是 statement.executeUpdate( sql ),我想要一个 println( "Did: "+ sql ),在此测试中从未调用过第一个方法。

显然,一种方法是简单地替换这些语句 - 或者复制整个文件并替换它们。但它很容易出错,如果我把它改回来,我可能会忘记一些东西。另外,它非常多余。

如何解决这个问题?如何用 JUnit 做到这一点?

免责声明:请不要使用“参数化您的类”之类的解决方案。我希望我的构造函数只有很少的参数,我不想每次调用它时都必须指定所有内容。测试类在我的应用程序中是二等公民,它们对实际类/实际开发应该几乎没有影响。

最佳答案

您应该定义一个包含类中所有数据库方法的接口(interface)。然后,确保您现有的数据库类实现该接口(interface)。

现在您有了一个接口(interface),您可以模拟该类或开发一个 stub 类进行测试。 stub 类可以只打印 SQL,或者任何你想要的。模拟类更强大,可用于确保您的业务逻辑正常工作。

最后一步是确保使用数据库的任何地方都接受构造函数中的接口(interface)。例如

public class ClassThatUsesTheDatabase {

public ClassThatUsesTheDatabase(DatabaseProvider provider) {
//...
}
}

DatabaseProvider 是您的界面。这允许您使用 stub 或模拟测试 ClassThatUsesTheDatabase。在生产中,您将使用您的具体实现来构建此类。

在我看来,这是编写依赖于外部资源的应用程序的唯一明智的方法。


重新阅读您的问题后,我担心以下段落:

Disclaimer: Please no solutions like "Parameterize your class." I want my constructors to have very few parameters, I don't want to have to specify everything whenever I call it. The test classes are second class citizens in my application and they should have little to no effect on the actual classes / the actual development.

测试类不是二等公民。如果您认真对待代码质量,它们与您的生产代码一样重要。是的,您经常需要设计生产代码以使其适合单元测试。这是不可避免的。然而,好处是巨大的。

关于java - 编写高效且无冗余的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com