- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个测试用例,它修改了我的 spring 上下文,并且可能会遇到无限循环。在测试用例之后,我希望有一个干净的 spring 上下文,因此我使用 @DirtiesContext
注释。为了防止无限循环,我添加了 jUnit 超时。
@Test(timeout = 1000)
@DirtiesContext
public void testTimeout() {
//test stuff
}
问题是,如果测试遇到超时,jUnit 似乎会以 spring 不再处理上下文重置的方式终止它。如果我在类级别添加 @DirtiesContext
,则会出现相同的行为。
还有其他方法可以实现我想要做的事情吗?
最佳答案
要使用 JUnit 和 Spring TestContext Framework (TCF) 配置超时,您有两大类选项:
Timeout
规则或timeout
@Test
的属性、您的测试和所有嵌套规则、关联的before/after方法、TCF回调等将在一个单独的线程中执行,如果超时 已超出。@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 上下文对于后续测试方法将保持损坏状态。
唯一真正的解决方案是确保您使用@DirtiesContext
与 BEFORE_METHOD
next 方法的模式,该方法在由于超时而抢先中止的方法之后执行。然而...确切地知道哪个方法是“下一个”方法可能是具有挑战性的部分...除非您使用 JUnit 的 @FixMethodOrder
支持。
问候,
Sam(Spring TestContext 框架的作者)
关于java - 将 jUnit 超时与 @DirtiesContext 结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31857312/
我一直在使用 Spring,遇到了 spring 提供的 @DirtiesContext 注释。当您想在运行每个方法之前刷新应用程序上下文时(当然以牺牲性能为代价),在每个方法上使用它是有意义的,但是
自从我从 Spring 3.2.6 迁移到 Spring 4.1.2 后,我的测试就无法正常工作了。我发现 AnnotationTransactionAspect (TransactionAspect
我有几个junit测试, @ContextConfiguration(locations = { "file:../business/src/test/resources/application-co
我有一个测试用例,它修改了我的 spring 上下文,并且可能会遇到无限循环。在测试用例之后,我希望有一个干净的 spring 上下文,因此我使用 @DirtiesContext 注释。为了防止无限循
我正在开发一些使用 Kafka-streams 的应用程序的测试,该应用程序还使用 Spring Boot 1.5,它导入 spring-kafka 的 1.2 版。详细来说,我正在使用 KafkaE
由 Cucumber 执行的集成测试往往会留下导致后续测试出现问题的上下文。明显的解决方案似乎是 Spring 的 @DirtiesContext,但它不是在运行所有 cucumber 功能之后拆除上
在 Spring Boot 中,我使用 @DirtiesContext 来确保在每个测试用例之前清除数据库。 Quarkus AFAIK 没有@DirtiesContext 注释。相反,建议使用 @T
我正在尝试在 Spring Boot 中运行一些集成测试。为此,我认为我们应该在每次测试运行后使用 @DirtiesContext 来清理数据库。 我现在尝试了几种方法,但效果都一样。 这是我的设置:
我正在开发一个 Spring-Boot 网络应用程序。编写集成测试的通常方式是: @Test @Transactional @Rollback(true) public void myTest() {
测试方法后我的应用程序上下文未关闭。 我使用 Junit 5.3.1、spring 5.1.0.RELEASE 进行 Selenium WebDriver 测试。 这是我的 bean : @Confi
你好,我最近更新了我的 spring boot 应用程序并注意到了新功能(DirtiesContext.ClassMode.BEFORE_CLASS),这似乎符合我的需要,因为我在使用注释为@Rabb
在我的一个测试类(class)中,我使用: //Make a security context SecurityContext securityContext = mock( SecurityCont
上下文 带有 Rest 端点和 JMS AMQ 监听器的 Spring Boot 应用程序 观察到的测试行为 测试类在不需要单独的 DirtiesContext 的情况下运行良好,但是当整个测试类套件
我正在尝试执行 Spring Boot 应用程序的一组 JUnit4 测试类,该应用程序由多个 Web 服务组成并配置了一个数据库。 每次测试后都会清除上下文,这很方便,因此我在每个测试类上添加了 @
我是一名优秀的程序员,十分优秀!