@DirtiesContext在每个黄瓜测试场景之后都会关闭上下文,而不是类

时间:2016-06-16 15:31:26

标签: java spring spring-boot integration-testing cucumber-jvm

黄瓜执行的集成测试往往会留下导致后续测试出现问题的上下文。显而易见的解决方案似乎是Spring的@DirtiesContext,但是在所有黄瓜功能运行之后,它不是在拆除上下文,而是在每个场景之后执行此操作,从而使测试执行时间相当长。 也试过@TestExecutionListeners,但没有运气。

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( classes = { MyApplication.class, MyTestComponent.class }, loader = SpringApplicationContextLoader.class )
@ActiveProfiles( { "test", "someotherprofile" } )
@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_CLASS )
@WebIntegrationTest( randomPort = true )
public class StepDefs extends StepDefUtils {
    // givens, whens, thens

我是否尝试以不受支持的方式使用DirtiesContext?

2 个答案:

答案 0 :(得分:0)

将黄瓜测试方法编译到不同的测试类中,以便在每个测试方法之后运行@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_CLASS )

不幸的是,我没有看到任何适合您需求的DirtiesContext模式。 我会搜索一些黄瓜监听器并通过它手动使弹簧上下文变脏。

答案 1 :(得分:0)

如先前的回答所述,场景被编译并作为单独的类运行,从而阻止DirtiesContext正常工作,并且出于相同的原因,黄瓜中没有每个功能的挂钩。

解决方法是将标记放在方案中,并让带有钩子的类检测这些标记,并在afterTestClass方法期间有条件地弄脏上下文。 标签可让您控制何时弄脏上下文,例如,如果希望每个功能都具有新的上下文,然后使用标签标记最后一个场景,或者在需要时每个功能可以花费很多时间。

 public class CucumberFeatureDirtyContextTestExecutionListener extends AbstractTestExecutionListener{

   private static boolean dirtyContext = false;

   @After("@DirtyContextAfter")
   public void afterDirtyContext(){
     dirtyContext = true;
   }

   @Override public void afterTestClass(TestContext testContext) throws Exception {
     if (dirtyContext) {
       testContext.markApplicationContextDirty(HierarchyMode.EXHAUSTIVE);
       testContext.setAttribute(DependencyInjectionTestExecutionListener.REINJECT_DEPENDENCIES_ATTRIBUTE, TRUE);
       dirtyContext = false;
     }
   }
 }

用标记标记方案

@DirtyContextAfter  
Scenario: My scenario

在步骤类中,使用spring注册侦听器

@TestExecutionListeners(listeners = {DependencyInjectionTestExecutionListener.class, CucumberFeatureDirtyContextTestExecutionListener.class})

确保侦听器在黄瓜胶中,以便注册钩子后
由于上下文已经设置,因此无法在beforeClass上使用它,因此必须在afterClass上进行。