gpt4 book ai didi

java - 最佳实践 : how to set config file at runtime for tests

转载 作者:行者123 更新时间:2023-12-02 04:34:35 27 4
gpt4 key购买 nike

作为家庭作业(我是初学者),我必须编写一个访问数据库(PostgreSQL)的 Java 程序。例如,该程序可以插入新用户、增加一些字段等,并且我有诸如 addUser(User t)、deleteUser(User t) 等方法。

我还使用junit5编写了测试方法。对于测试,我使用“测试”数据库,与“工作”数据库分开。打开两个数据库的坐标(数据库名称、密码等)存储在两个名为 config.properties 和 config.test.properties 的文件中,这两个文件在运行时选择。

我现在所做的是沿着这些思路,使用 boolean 标志变量:

    public class UserDao {
public boolean isTestMode = false;

public Connection getConnection() {

if (this.isTestMode) {
input = cl.getResourceAsStream("config.test.properties");
} else {
input = cl.getResourceAsStream("config.properties");
}
...
}
}

在我的测试方法中,我设置如下标志:

        void testAddUser() {
UserDao dao = new UserDao();
dao.isTestMode = true;
...
}

在常规的非测试方法中,我不设置 isTestMode,因此保留其默认(假)值并使用 config.properties。我的方法有效,但我的导师告诉我,这样做是不好的做法,我应该改变它,例如(他建议)进行依赖项注入(inject)。我不太确定如何继续。我可以将 configFilename 设为类变量,并向 UserDao 类添加一个接受文件名的新构造函数,如下所示:

public class UserDao {
private String configFilename = "config.properties";

public UserDao() {
}

public UserDao(String filename) {
this();
this.configFilename = filename;
}

public Connection getConnection() {

input = cl.getResourceAsStream(this.configFilename);
...
}

}

然后在测试方法中我使用新的构造函数 UserDao("config.test.properties")

一个(在我看来更好的)变体是引入一个构造函数,它接受 boolean 值 isTestMode 并相应地设置 configFilename (我不需要也不希望在构造函数中灵活地指定任何文件名)。但本质上这与我原来的方法是一样的,我被告知要改变。另外,那里没有依赖注入(inject)......在这种情况下最好的做法是什么?欢迎任何建议!

最佳答案

传递参数可以看作是一个简单的依赖注入(inject)。

关于您的 java:当您为 configFilename 设置默认值时,您可以将其视为您在应用程序中使用的约定。

你的类(class)不需要这个。如果你避免这个约定,你就可以免费获得不变性。例如,您可以这样做:

    public class UserDao {


private final String configFilename;

public UserDao(String filename) {
this.configFilename = filename;
}

public Connection getConnection() {

input = cl.getResourceAsStream(this.configFilename);
...
}

}

UserDao 可以由您的测试类或主类以相同的方式使用。

使用您的解决方案,您可能会交付永远不会在生产中运行的代码(isTestModetrue 的分支),这不是一个好的做法。该代码在生产中可以被视为死代码。

关于java - 最佳实践 : how to set config file at runtime for tests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56557754/

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