只有在运行测试套件中的所有测试之后,Spring测试才会关闭上下文

时间:2018-06-11 14:56:35

标签: java spring testng integration-testing spring-test

假设我们的测试编写如下(在单独的文件中):

@SpringBootTest(classes = {SomeBeansProvider.class, FunnyCatBeansProvider.class})
public class CatsTest extends AbstractTestNGSpringContextTests {(...)}

@SpringBootTest(classes = {SomeBeansProvider.class, FunnyCatBeansProvider.class})
public class CatTest2 extends AbstractTestNGSpringContextTests {(...)}

@SpringBootTest(classes = {SomeBeansProvider.class, DogBeansProvider.class})
public class DogsTest extends AbstractTestNGSpringContextTests {(...)}

我不想让事情变得复杂,所以让我们所有人都假装所有这些测试打印出类似于"测试#no执行完成的事情。"。

另外,让我们在SomeBeansProvider.class中定义这样的方法

@EventListener(ContextClosedEvent.class)
public void onContextClose(final ContextClosedEvent contextClosedEvent) {
   log.info("Context closed.");
} 

如果执行这些测试(使用TestNG runner),您将看到与此类似的控制台输出:

  1. 测试1执行完成。
  2. 测试2执行完成。
  3. 测试3执行完成。
  4. 上下文关闭。
  5. 上下文关闭。
  6. 由于CatTest和CatTest2具有相同的上下文,因此只为其创建一个,而DogTest则另外一个。

    问题在于我希望在不再需要上下文后关闭它们。我想知道是否可以在执行期间以某种方式自动对测试进行分组,因此同时没有多个上下文实例。所以我希望输出看起来像这样:

    1. 测试1执行完成。
    2. 测试2执行完成。
    3. 上下文关闭。
    4. 测试3执行完成。
    5. 上下文关闭。
    6. 这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

我们可以在测试用例中使用下面的Spring注释,使其在类级别或方法级别上下文关闭。

@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)

@DirtiesContext(classMode=ClassMode.AFTER_CLASS)
  

对于您的场景,您可以这样做,您可以使用   @FixMethodOrder(MethodSorters.NAME_ASCENDING)在类级别,和   注释@DirtiesContext(methodMode = ClassMode.AFTER_EACH_TEST_METHOD)   在每个测试用例中,无论您想要关闭上下文。并保持   所有相关的测试用例,无论是在课堂上的第一个还是最后一个   升序顺序约定,以便它们连续运行   他们将使用相同的上下文(没有@DirtiesContext)。