首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >跨junit测试类重用spring应用程序上下文

跨junit测试类重用spring应用程序上下文
EN

Stack Overflow用户
提问于 2011-12-14 17:17:30
回答 2查看 76.1K关注 0票数 94

我们有一堆JUnit测试用例(集成测试),它们在逻辑上被分组到不同的测试类中。

我们能够为每个测试类加载一次Spring应用程序上下文,并将其重用于http://static.springsource.org/spring/docs/current/spring-framework-reference/html/testing.html中提到的JUnit测试类中的所有测试用例

然而,我们只是想知道是否有一种方法可以为一堆JUnit测试类只加载一次Spring应用程序上下文。

FWIW,我们使用Spring3.0.5,Maven4.5和JUnit来构建项目。

EN

回答 2

Stack Overflow用户

发布于 2014-04-11 13:55:39

为了添加到Tomasz Nurkiewicz's answer中,从Spring3.2.2开始,可以使用@ContextHierarchy注释来拥有独立的、关联的多个上下文结构。当多个测试类想要共享(例如)内存中的数据库设置(数据源、EntityManagerFactory、tx管理器等)时,这是很有用的。

例如:

代码语言:javascript
复制
@ContextHierarchy({
  @ContextConfiguration("/test-db-setup-context.xml"),
  @ContextConfiguration("FirstTest-context.xml")
})
@RunWith(SpringJUnit4ClassRunner.class)
public class FirstTest {
 ...
}

@ContextHierarchy({
  @ContextConfiguration("/test-db-setup-context.xml"),
  @ContextConfiguration("SecondTest-context.xml")
})
@RunWith(SpringJUnit4ClassRunner.class)
public class SecondTest {
 ...
}

通过这种设置,使用"test-db- setup -context.xml“的上下文将只创建一次,但是其中的bean可以被注入到单个单元测试的上下文中

更多关于手册的信息:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/testing.html#testcontext-ctx-management (搜索"context hierarchy")

票数 28
EN

Stack Overflow用户

发布于 2020-03-19 07:21:01

基本上,如果您在不同的测试类中具有相同的应用程序上下文配置,spring就足够智能,可以为您配置此配置。例如,假设您有两个类A和B,如下所示:

代码语言:javascript
复制
@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class A {

    @MockBean
    private C c;
    //Autowired fields, test cases etc...
}

@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class B {

    @MockBean
    private D d;
    //Autowired fields, test cases etc...
}

在本例中,类A模拟bean C,而类B模拟bean D。因此,spring将它们视为两种不同的配置,因此将为类A加载一次应用程序上下文,为类B加载一次。

相反,如果我们想让spring在这两个类之间共享应用程序上下文,它们必须如下所示:

代码语言:javascript
复制
@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class A {

    @MockBean
    private C c;

    @MockBean
    private D d;
    //Autowired fields, test cases etc...
}

@ActiveProfiles("h2")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class B {

    @MockBean
    private C c;

    @MockBean
    private D d;
    //Autowired fields, test cases etc...
}

如果您像这样连接您的类,spring将仅为A类或B类加载一次应用程序上下文,这取决于这两个类中的哪个类在测试套件中最先运行。这可以在多个测试类中复制,唯一的标准是您不应该以不同的方式定制测试类。任何导致测试类与其他类不同的定制(从spring的角度来看)最终都会在spring之前创建另一个应用程序上下文。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8501975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档