如何告诉弹簧只加载JUnit测试所需的豆子?

2022-09-01 11:03:45

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

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

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

示例:

说类 Foo 只注入酒吧

public class Foo {

@Inject
Bar bar;

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

但是应用程序上下文具有bean foobar和bar。我知道这不是一个有效的应用程序上下文,但请放心,我的所有代码都可以正常工作。

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

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

谢谢。


答案 1

考虑将 xml bean 标记添加到您的 spring 上下文中(或添加到那些需要很长时间启动的特定 Bean 中)。这将确保只创建那些使用 applicationContext.getBean(类或 bean-name)调用的 bean,或者通过 / 注入到测试中。(尽管如此,还是会创建一些其他类型的bean,如bean,但您需要检查这是否是一个问题)default-lazy-init="true"lazy-init="true"@Autowired@Inject@Scheduled

(如果您使用弹簧Java配置,请添加到配置文件中)@Lazy

警告 - 如果有一个 Bean 没有使用 applicationContext.getBean() 显式初始化,或者作为使用 applicationContext.getBean() 获得的 Bean 使用的依赖项注入,那么该 Bean 将不再被构造或初始化。根据您的应用程序,这可能会导致事情失败或不会失败。也许你可以有选择地将这些豆子标记为lazy-init="false"


答案 2

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

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

使用以下注释为所需的测试类添加注释

@ContextConfiguration(locations = "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 {}

推荐