【发布时间】:2018-06-11 14:56:35
【问题描述】:
假设我们有如下编写的测试(在单独的文件中):
@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 {(...)}
我不想让事情复杂化,所以让我们暂时假设所有这些测试都打印出类似“Test #no execution completed”的内容。
另外让我们在 SomeBeansProvider.class 中定义这样的方法
@EventListener(ContextClosedEvent.class)
public void onContextClose(final ContextClosedEvent contextClosedEvent) {
log.info("Context closed.");
}
如果您执行这些测试(使用 TestNG 运行程序),您将看到类似于以下内容的控制台输出:
- 测试 1 执行完成。
- 测试 2 执行完成。
- 测试 3 执行完成。
- 上下文已关闭。
- 上下文已关闭。
由于 CatTest 和 CatTest2 具有相同的上下文,因此将为它们创建一个上下文,并为 DogTest 创建一个额外的上下文。
问题是我希望在不再需要上下文后立即关闭它们。我想知道是否可以在执行期间以某种方式自动对测试进行分组,这样就不会同时有多个上下文实例。所以我希望输出看起来像这样:
- 测试 1 执行完成。
- 测试 2 执行完成。
- 上下文已关闭。
- 测试 3 执行完成。
- 上下文已关闭。
这甚至可能吗?
【问题讨论】:
-
有什么理由不利用
@DirtiesContext注释? -
@DirtiesContext 每次都会破坏我的上下文,所以它就像:测试 1 执行完成。上下文关闭。测试 2 执行完成。上下文关闭。测试 3 执行完成。上下文关闭。我想利用 spring 缓存我的 bean。
-
您希望利用 有时 缓存的 bean。如果您愿意,它也可能会要求您的代码测试结构略有不同,但
@DirtiesContext会让您达到 50%(这就是为什么我也没有将其编码为答案的原因)。 -
不,你不能,因为没有严格的测试运行顺序。因此,您想要的根本不可能。所有上下文都将被缓存(如果我没记错的话,默认最多 32 个不同的上下文)并将在所有测试运行后被销毁(因为那是测试管理器将被销毁的时间)或者当加载第 33 个上下文时,最旧的将被销毁。
-
如果您将其发布在单独的帖子中,我会将您的答案标记为已接受。 (Makoto,M.Deinum)。
标签: java spring testng integration-testing spring-test