Java 如何告诉spring只加载JUnit测试所需的bean?
一个可能有高级答案的简单问题 问题是: 我的问题是,是否有一种方法可以在应用程序上下文中仅实例化特定JUnit测试所需的类 原因是: 我的应用程序上下文变得相当大。我还做了很多集成测试,所以我想当我说每次运行测试时,应用程序上下文中的所有类都会实例化,这需要时间时,你会理解的 例如: 说类Foo只注入吧Java 如何告诉spring只加载JUnit测试所需的bean?,java,spring,junit,applicationcontext,Java,Spring,Junit,Applicationcontext,一个可能有高级答案的简单问题 问题是: 我的问题是,是否有一种方法可以在应用程序上下文中仅实例化特定JUnit测试所需的类 原因是: 我的应用程序上下文变得相当大。我还做了很多集成测试,所以我想当我说每次运行测试时,应用程序上下文中的所有类都会实例化,这需要时间时,你会理解的 例如: 说类Foo只注入吧 public class Foo { @Inject Bar bar; @Test public void testrunSomeMethod() throws RegisterFault
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呢
谢谢。是的,我们可以这样做,使用每个测试用例的上下文。准备一个测试上下文xml文件,其中包含测试用例所需的bean 如果使用maven,请将test-context.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 {}
这不是直接的答案,所以我不会把它标记为解决方案。但希望能有所帮助 一般来说,我有三种选择
考虑将
default lazy init=“true”
添加到spring上下文xml bean标记中(或者将lazy init=“true”
添加到那些需要长时间启动的特定bean中)。
这将确保仅创建那些使用applicationContext.getBean(类或bean名称)调用或通过@Autowired
/@Inject
注入测试的bean。(尽管如此,仍将创建一些其他类型的bean,如@Scheduled
bean,但您需要检查这是否有问题)
(如果使用SpringJava配置,请将@Lazy
添加到配置文件中)
注意-如果有一个bean没有使用applicationContext.getBean()显式初始化,或者没有被注入为使用applicationContext.getBean()获得的bean所使用的依赖项,那么该bean将不再被构造或初始化。根据您的应用程序,这可能会导致失败或失败。也许您可以有选择地将这些bean标记为
lazy init=“false”
您是否尝试过为每个测试创建一次上下文?或者这不是一种选择?我已经考虑过了,但是我有很多测试,所以为每个测试创建应用程序上下文需要时间。我只是希望告诉spring我需要从所说的应用程序上下文中得到什么,我想我们有误解。我的意思是,创造一次。因此,您不会为每个测试创建上下文。创建上下文,然后在此之前在此创建的上下文上启动测试。如果这不是选项,因为您正在对bean进行一些更改,并且需要重置它们,那么VinayVeluri的答案是好的。但是您需要创建单独的xml文件,这可能有点烦人,因为您有大约100个上下文文件。如果您希望每个测试都有单独的上下文(0或混合解决方案;)哦,好的,我理解你对这个问题的回答。我以为这和维奈·维鲁里一样。看看这个解决方案的问题是什么。如果您同时运行所有测试,效果非常好,这实际上就是我忙于测试的原因,但是如果您只想多次运行一个测试(假设您正在忙于测试代码,但有些东西不起作用,您需要进行更改,然后再次测试),这需要时间。我试图消除同时使用两种解决方案所需的时间,这将解决您的问题,我猜:P但您不能合并它们。所以,在进行完整测试时,创建一次,但在单独测试时,创建所需的最小上下文。我不知道这是否可能,就像smart test runner一样,我知道应该创建什么样的上下文。或者改变你的测试方法?集成测试应该同时运行。就像詹金斯那样。因为它们与它们的定义相去甚远。逐个运行,应进行清洁单元测试。而单元测试就像不到一秒钟。所以我会选择mocks-Mockito。一如既往。但这太离谱了。我已经考虑过了,但我有很多测试,所以为每个测试创建应用程序上下文需要时间。我希望告诉spring我需要从所说的应用程序上下文中得到什么?有什么基于注释的方法吗?嗨,如何编写test-context-case1.xml
来自动将所有文件包含在一些包中(例如com.company.project.module_one)?我知道如何使用@ComponentScan
,但这似乎在这里不起作用。。。谢谢广告4:你不可能自动做到这一点。bean在创建时可能会运行一些代码,并且不可能自动决定这些代码是否重要。虽然这可能是糟糕的编码,但您可能有一个bean,它在创建时向数据库添加一些记录,然后代码的某些部分稍后读取该记录。作为一名开发人员,您可能能够发现这样的依赖关系,但您不能自动做到这一点——这相当于停止问题