spring 如果出现`Failed to load ApplicationContext`错误,则自动终止所有集成测试

lxkprmvk  于 2023-06-21  发布在  Spring
关注(0)|答案(4)|浏览(126)

我们有一些集成测试(使用spring框架编写)由于bean初始化异常而失败,最终导致Failed to load ApplicationContext。根据我对spring testing docs的理解,ApplicationContext的加载发生在类级别,所以我的疑问是-
1.一旦ApplicationContext发生故障(即Failed to load ApplicationContext)在集成测试类运行期间由于bean初始化异常ApplicationContext是否尝试为该特定集成测试类中存在的每个单独集成测试再次启动(最终将失败)?
1.问上面的场景,因为我们看到当bean失败发生时,到postgres的连接数量激增,似乎对于集成测试类中的每个集成测试(最终由于Failed to load ApplicationContext而失败),spring试图创建一个到postgres的新连接,并且在ApplicationContext失败之前没有销毁它。我们如何才能阻止这种情况,请提供一些建议。
1.另外,一旦我们得到Failed to load ApplicationContext,是否有一种方法可以完全自动地以编程方式终止所有集成测试的运行?如果是,请帮助如何实现它?谢谢

测试框架- junit + Spring

更新:提及使用的测试框架。

ygya80vv

ygya80vv1#

如果ApplicationContext反复加载失败,目前没有办法中止集成测试。
如需投票支持,请参阅this Spring Framework issue

sg2wtvxw

sg2wtvxw2#

1.如果在测试类中有多个集成测试,那么它将多次失败。
1.您可以使用dependsOnGroups属性终止所有集成测试用例。
例如,您可以有一个方法来检查是否有bean异常失败,并声明所有其他测试都依赖于此方法。但这可以使用TestNG来完成

@Test(groups = { "isApplicationContextFailed" }) // you can run with simply @Test here if there is only one independent test.
public void isApplicationContextFailed() {}

@Test(dependsOnMethods = { "isApplicationContextFailed" })
public void queryTestOne() {}

@Test(dependsOnMethods = { "isApplicationContextFailed" })
public void queryTestTwo() {}

您可以从TestNG -> www.example.com了解更多信息https://testng.org/doc/documentation-main.html#dependent-methods
注意:-如果你使用的是JUnit,还有一些其他的方法可以做同样的事情。请在这种情况下更新。

voj3qocg

voj3qocg3#

如果你使用的是JUnit,那么在你的测试类中添加下面的登录名,它就可以工作了。

public class BaseClass {

@BeforeClass
    public void isApplicationContextFailed() {
        //logic to check for application failure
    }

//continue with your test methods.
}

建议您通过下面的参考资料来详细了解。
https://junit.org/junit4/javadoc/4.13/org/junit/BeforeClass.html
https://howtodoinjava.com/testng/testng-before-and-after-annotations/

hjzp0vay

hjzp0vay4#

  • (此答案取代我以前过时的答案)*

我刚刚在Spring Framework 6.1 M1中实现了对"test context failure threshold"的内置支持。
从Spring Framework 6.1开始,上下文 * 失败阈值 * 策略已经到位,这有助于避免重复尝试加载失败的ApplicationContext。默认情况下,失败阈值设置为1,这意味着对于给定的上下文缓存键,只会尝试加载一次ApplicationContext。任何后续尝试加载相同上下文缓存键的ApplicationContext都将导致立即执行IllegalStateException,并显示一条错误消息,解释该尝试被抢先跳过。
有关详细信息,请参阅Spring Framework reference manual

相关问题