gpt4 book ai didi

java - JUnit 测试中的成员变量

转载 作者:行者123 更新时间:2023-11-29 04:19:35 24 4
gpt4 key购买 nike

我在运行一些单元测试时遇到了一些有趣的事情。我有以下方法:

private void createSchemaIfNecessary() throws SQLException, IOException{
if(!schemaExists){
try (Connection connection = dataSource.getConnection(); Statement statement = connection.createStatement();) {
statement.execute(getSQLByFileName(GOLF_COURSE_TABLE_CREATION_SCRIPT));
statement.execute(getSQLByFileName(GOLF_COURSE_HOLE_TABLE_CREATION_SCRIPT));
connection.commit();
schemaExists = true;
}
}
}

每个单元测试调用此方法来确定是否创建表。 schemaExists 变量是一个成员变量。我注意到,随着每个测试的运行,在某些情况下,即使在点击 schemaExists = true; 行后,下次调用该方法时,schemaExists 的计算结果仍为 false。然后我将变量设置为静态,这解决了问题。

随着各个单元测试的运行,它们不是都在单元测试类的单个实例的上下文中运行吗?

最佳答案

我将假设 schemaExists是您的测试类的非静态成员。

在调用测试方法(注释 @Test )之前,junit(默认情况下)创建测试类的新实例 ( More detail here )。

因此,任何非静态类成员都将按照类中的定义进行初始化 如果没有显式初始化,那么它们将被设置为默认值,所以如果 schemaExistsboolean (原始)然后 false .

如果你想为所有测试设置一些东西来共享,我建议你要做的是创建一个 @BeforeClass初始化静态属性的静态方法。

  • 这将确保在运行任何测试方法之前,它只针对给定的测试类运行一次
  • 阅读您的代码的其他人非常清楚该方法的意图

这是一个在您的 OP 中使用数据库架构初始化代码的示例:

@BeforeClass 
public static void setupDBOnce() {
Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
statement.execute(getSQLByFileName(GOLF_COURSE_TABLE_CREATION_SCRIPT));
statement.execute(getSQLByFileName(GOLF_COURSE_HOLE_TABLE_CREATION_SCRIPT));
connection.commit();
}

如果出于某种原因您不希望这种行为(每个测试方法运行一个实例)you can do any of these :

  • @TestInstance(Lifecycle.PER_CLASS) 注释你的类(class)
  • 传递以下 VM arg:-Djunit.jupiter.testinstance.lifecycle.default=per_class
  • 创建或添加到名为 junit-platform.properties 的现有属性文件在类路径的源根目录中找到条目:junit.jupiter.testinstance.lifecycle.default = per_class

如果您确实要覆盖默认值,请记住文档中的一条注释:

When using this mode, a new test instance will be created once per test class. Thus, if your test methods rely on state stored in instance variables, you may need to reset that state in @BeforeEach or @AfterEach methods.

关于java - JUnit 测试中的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205422/

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