gpt4 book ai didi

java - 将 jUnit 超时与 @DirtiesContext 结合起来

转载 作者:行者123 更新时间:2023-12-02 04:28:18 24 4
gpt4 key购买 nike

我有一个测试用例,它修改了我的 spring 上下文,并且可能会遇到无限循环。在测试用例之后,我希望有一个干净的 spring 上下文,因此我使用 @DirtiesContext 注释。为了防止无限循环,我添加了 jUnit 超时。

@Test(timeout = 1000)
@DirtiesContext
public void testTimeout() {
//test stuff
}

问题是,如果测试遇到超时,jUnit 似乎会以 spring 不再处理上下文重置的方式终止它。如果我在类级别添加 @DirtiesContext ,则会出现相同的行为。

还有其他方法可以实现我想要做的事情吗?

最佳答案

要使用 JUnit 和 Spring TestContext Framework (TCF) 配置超时,您有两大类选项:

  1. 抢占式:如果您使用 JUnit 的 Timeout规则或timeout @Test 的属性、您的测试和所有嵌套规则、关联的before/after方法、TCF回调等将在一个单独的线程中执行,如果超时 已超出。
  2. 非抢占式:如果您使用 Spring 的 @Timed TCF 的注释、您的测试和所有嵌套规则、关联的 before/after 方法、TCF 回调等将在与测试运行程序相同的线程中执行,并且仅当正常终止且超过超时时,测试才会失败。

两者都是Timeout规则和 timeout @Test 的属性结果是 FailOnTimeout在后台使用的语句;和FailOnTimeout在单独的线程中执行链中的下一条语句,如果超过超时,该线程将抢先终止。因此,这两个基于 JUnit 的配置选项的行为自然是相同的:语句链的执行提前结束,而不给任何 after 回调机会执行其任务。结果是 Spring 的 DirtiesContextTestExecutionListener 中的 afterTestMethod() 回调在这种情况下永远不会被调用,因此上下文不会被弄脏。

Is there another way to achieve what I'm trying to do?

对于初学者来说,使用 Spring 的 @Timed注释不适合您,因为它不会抢先中止在无限循环中运行的代码。

您提到您通过使用 @DirtiesContext(methodMode = BEFORE_METHOD) 发现了解决方法Spring Framework 4.2 中引入的功能。这可能在某些情况下有效,但这种解决方法充其量是脆弱的:使用此解决方法会导致上下文在此<之前关闭并重新启动/strong>特定方法;但是,如果相关代码在抢占式超时之前修改了上下文,则您的 Spring 上下文对于后续测试方法将保持损坏状态。

唯一真正的解决方案是确保您使用@DirtiesContextBEFORE_METHOD next 方法的模式,该方法在由于超时而抢先中止的方法之后执行。然而...确切地知道哪个方法是“下一个”方法可能是具有挑战性的部分...除非您使用 JUnit 的 @FixMethodOrder支持。

问候,

Sam(Spring TestContext 框架的作者)

关于java - 将 jUnit 超时与 @DirtiesContext 结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31857312/

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