当前位置: 首页 > 知识库问答 >
问题:

JUnit 5中的参数化beforeach/beforeal

章烨烨
2023-03-14

我想为一个类似数据库的小型应用程序编写一个测试。此应用程序使用查询,查询应该返回正确的结果。这在JUnit 5中很容易实现,类似于

@BeforeEach
void before() {
  database = prepareDatabase();
}

@Test
void testQuery1() {
  assertThat(database.query("query1")).isEqualTo("result1");
}

@Test
void testQuery2() {
  assertThat(database.query("query2")).isEqualTo("result2");
}

....

现在我想添加优化开关(例如查询优化器或数据库索引)。无论运行什么优化开关,查询都应返回相同的结果(优化只应更改效率,而不应更改结果)。

对于测试,这意味着我想对其他一些实现的prepareDatabase()运行相同的方法(例如,一个有优化器,一个有索引,一个没有)。

我还没有找到合适的扩展。我想过为每个优化设置复制整个类,或者提供来自共享父类的方法。然而,这并不像JUnit 5完成这项任务的方式。也许有人可以给我指出一个可以帮助我解决这个问题的功能

共有2个答案

宦博雅
2023-03-14

缺少的JUnit5功能称为“容器模板”,是一个计划的功能请求,位于https://github.com/junit-team/junit5/issues/871.

屈星腾
2023-03-14

与往常一样,有多种可能的方法可以实现您的目标。其中之一是使用Java继承。您甚至不需要连接任何高级JUnit 5功能,只需一个旧的Java概念。

使用方法和抽象prepareDatabase()创建抽象类。

public abstract class QueryTest {

    Database database;

    @BeforeEach
    void before() {
        database = prepareDatabase();
    }

    @Test
    void testQuery1() {
        assertThat(database.query("query1"), is("result1"));
    }

    @Test
    void testQuery2() {
        assertThat(database.query("query2"), is("result2"));
    }

    abstract Database prepareDatabase();

}

然后-基于不同的变体,创建实现,仅覆盖此方法。

public class SwitchTrueQueryTest extends QueryTest {

    @Override
    Database prepareDatabase() {
        return new Database(true);
    }

}

public class SwitchFalseQueryTest extends QueryTest {

    @Override
    Database prepareDatabase() {
        return new Database(false);
    }

}

仅此而已。不需要更多,可重用测试在父类中,不需要复制。

报告示例

 类似资料:
  • 如何在Junit 5中参数化每个带注释的方法的@beforeach/@AfterEach?此方法应该从传递的流或对象列表中获取参数。 假设您有一个基类BaseSmokeTest,其中在名为prepare()的@beforeach注释方法中初始化WebDriver。现在,LoginSmokeTest或LogoutSmokeTest等其他类扩展了BaseSmokeTest,因此它们不关心WebDriv

  • 我试图定义一个,如示例MockitoExtension所提供的,但无法成功地使用参数化的类实例。 期待着关于如何用在中实现接口的类的参数化实例测试接口的建议。

  • 在JUnit 4中,通过使用注释很容易跨一堆类测试不变量。关键是一组测试正在针对单个参数列表运行。 如何在JUnit 5中复制这一点,而不使用JUnit-vintage? 不适用于测试类。听起来可能是合适的,但该注释的目标也是一个方法。 此类 JUnit 4 测试的一个示例是:

  • 我正在尝试从CSV文件运行参数化测试。 如果我只使用这样的CSVSource,它就会起作用: 但如果我从一个文件中尝试同样的方法,它将不起作用: 我也尝试过使用硬路径访问我的文件,但对于Eclipse中的文件测试,我总是能得到消息 找不到使用测试runnter“JUnit 5”的测试。 JUnit期望文件在哪里? 以下是我的依赖关系: 有人知道我可能遗漏了什么或者错误在哪里吗? 提前谢谢你 保罗

  • 我一直在查看JUnit5中参数化测试的示例(我是新手),但没有找到我想要的(除非我误解了如何使用它们)。 我遇到的所有示例都使用了诸如字符串、csv文件或methodSource之类的基本类型,但这些类型似乎都不适合我要做的事情。 如有任何帮助,不胜感激。

  • 我找不到像TestWatcher一样替代/工作的任何注释。 我的目标:有两个功能,这取决于测试结果。 成功?做某事 失败?做点别的