【问题标题】:In Junit4, How to change @Before behavior based on @Test annotationsJunit4中,如何根据@Test注解改变@Before行为
【发布时间】:2011-10-28 05:50:14
【问题描述】:

我希望我的@Before 方法知道当前正在执行的测试注解,以便@Before 方法可以做各种事情。具体来说,现在我们的@Before 总是执行各种初始化步骤,例如重新加载数据库等。我希望能够编写这样的代码:

@Before
void setUp() {
    if (testMethod.hasAnnotation(@NeedsDatabase)) {
        reloadDatabase();
    }
}

我想一种解决方案是使用@Rule 进行数据库初始化,但这实施起来会很复杂,而且我们现有的基础设施已经在@setUp 中处理了这个问题。我们已经有一个自定义的 Runner,所有测试都扩展了一个共享的基类,如果有帮助的话。

我试图想办法做到这一点,但我不知道 JUnit4 中有什么可用的。

【问题讨论】:

  • 有一些方法可以模拟您的需求,并且不会不必要地向代码添加过多的间接性。我会保持简单:在任何“需要数据库”的测试中,只需调用一个特殊的 setupDB 方法。这将使测试独立于运行它们的任何外部框架。一般来说,单元测试的 DRY 策略不会增加太多价值。

标签: java unit-testing junit4


【解决方案1】:

您可以使用@RunWith 注释,并创建自己的ParentRunner 来扫描您的@NeedsDatabase 注释并适当地处理设置。

【讨论】:

    【解决方案2】:

    【讨论】:

    • starting() 是在 @Before 之前还是之后执行的?我现在无法真正将行为移出@Before,但如果我可以在starting() 中获取Annotation[] 列表并将其存储在类本地成员变量中,那就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多