当前位置: 首页 > 知识库问答 >
问题:

如何告诉spring只加载JUnit测试所需的bean?

锺博耘
2023-03-14

一个可能有高级答案的简单问题。

问题是:我的问题是,有没有办法在应用程序上下文中仅实例化特定JUnit测试所需的类?

原因:我的应用程序上下文变得相当大。我还做了很多集成测试,所以当我说每次我运行测试时,我的应用程序上下文中的所有类都会被实例化,这需要时间。

示例:

说类Foo注入只有酒吧

public class Foo {

@Inject
Bar bar;

@Test
public void testrunSomeMethod() throws RegisterFault {
    bar.runSomeMethod();
}

但是应用程序上下文有bean foobar和bar。我知道这不是一个有效的应用程序上下文,但rest确保我的所有代码都能正常工作。

<beans>
     <bean id="foobar" class="some.package.FooBar"/>
     <bean id="bar" class="some.package.Bar"/>
<beans>

那么,我如何告诉spring只实例化测试类foo的Bar而忽略FooBar呢。

非常感谢。

共有3个答案

夏锐藻
2023-03-14

这不是直接的答案,所以我不会标记为解决方案。但希望它有帮助。

一般来说,我有三种选择。

>

  • 正如VinayVeluri很好地回答的那样。创建单独的上下文并在每次测试中单独启动它们。

    每个测试创建一次上下文。就像这里一样:跨junit测试类重用spring应用程序上下文这是一次测试所有测试的大优化。

    将前两个要点混合在一起。仅为测试目的创建一个较小的上下文。模拟一下,从来没有测试过但可以抛出NPE等:将Mockito模拟注入SpringBean以增强上下文构建。然后像第2点那样重复使用。为所有测试一次性构建。就我个人而言,我会同意这一点。

    这一个正在等待关于某种智能测试运行器的答案,它为每个测试创建了所需的最小上下文。

  • 司空坚
    2023-03-14

    是的,我们可以做到这一点,使用每个测试用例的上下文。准备一个测试上下文xml文件,其中包含测试用例所需的bean。

    如果使用maven,请放置测试上下文。xml在src/test/resources文件夹下。

    用以下注释注释您所需的测试类

    @ContextConfiguration(位置="classpath:test-application-context.xml")

    这有助于仅为测试用例加载特定的bean。

    如果你有两种测试用例,那么

    @Runwith(SpringJUnit4Runner.class)
    @ContextConfiguration(locations = "classpath:test-context-case1.xml")
    public class TestClassCase1 {}
    
    @Runwith(SpringJUnit4Runner.class)
    @ContextConfiguration(locations = "classpath:test-context-case2.xml")
    public class TestClassCase2 {}
    
    墨财
    2023-03-14

    考虑将默认的lazy init=“true”添加到spring上下文xml bean标记中(或者将lazy init=“true”添加到那些需要长时间启动的特定bean中)。这将确保只创建那些使用applicationContext调用的bean。getBean(类或bean名称)或通过Autowired注入测试。(尽管如此,仍将创建一些其他类型的bean,如调度的bean,但您需要检查这是否有问题)

    (如果您使用SpringJava配置,请将@Lazy添加到配置文件中)

    警告-如果有一个bean没有使用applicationContext显式初始化。getBean()或注入为使用applicationContext获得的bean使用的依赖项。getBean(),则该bean将不再被构造或初始化。取决于你的应用程序,这可能会导致事情失败或没有。也许您可以有选择地将这些bean标记为lazy init=“false”

     类似资料:
    • 梯度依赖性: FileNotFoundException: File:/C:/用户/用户/. gradle/缓存/模块-2/files-2.1/fop/fop/0.20.5/ffa9d8eb84897746aa196d3f3336d034ddb26f59/xercesImpl-2.2.1.jar fop jar确实没有xercesImpl-2.2.1.jar。代码使用org.apache.fop.

    • 理想情况下,我们希望添加一个任务,用于下载项目的第一级和可传递依赖项的所有源JAR。有办法做到这一点吗? 现在看来,这应该是默认的,至少对于第一级依赖项是这样,因为它提供了eclipse中的javadoc,这在完成代码时是非常好的。

    • 我正在使用Spring Boot构建一个REST API。我添加了Swagger-ui来处理文档。我在实现客户机身份验证流到swagger时遇到了一个问题,问题是我可以通过基本auth让swagger-ui授权提供的客户机ID(用户名)和客户机机密(密码),但swagger UI似乎没有应用到endpoint调用的结果访问令牌。 确认,我的授权过程;-使用basic auth将base64编码的用

    • 我用JPA Hibernate开发了一个SpringBoot应用程序,它运行得非常好。现在我不得不从测试开始,我真的不知道如何解决这个错误: 我的PlayersRepository是: 我见过这个答案,但没有找到解决方法。我应该更改或添加什么?以前从没用过这种东西,请好心点。

    • 抱歉,这似乎是一个无用的行为,但我们有没有办法在Spring Boot(1.3.8.RELEASE)的应用程序上进行junit测试。java这个类除了启动Spring Boot应用程序之外什么都不做? 如下所示: 也许我可以尝试捕捉异常?但我还可以测试什么,以便JUnit测试SpringApplication呢。run()?任何例子都值得赞赏。谢谢大家!

    • 我希望Spring Boot使用一个MySQL测试数据库,该数据库位于应用程序数据库旁边,用于集成测试。目前,它正在自动使用H2数据库,因为我在Gradle中添加了H2依赖项。 例如,这个测试现在使用H2数据库运行,我更希望它使用物理辅助数据库。