Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何告诉spring只加载JUnit测试所需的bean?_Java_Spring_Junit_Applicationcontext - Fatal编程技术网

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

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

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

问题是: 我的问题是,是否有一种方法可以在应用程序上下文中仅实例化特定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呢


谢谢。

是的,我们可以这样做,使用每个测试用例的上下文。准备一个测试上下文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 {}

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

一般来说,我有三种选择

  • 维纳维里回答得很好。创建单独的上下文,并在每个测试中分别启动它们

  • 每个测试创建一次上下文。就像这里:这是一个用于同时测试所有测试的大型优化

  • 把这两个要点混合起来。仅为测试目的创建一个较小的上下文。模拟一下,那些从未被测试过但可以抛出NPE等的东西,比如这里:提升上下文构建。然后像第2点一样重复使用它。所有测试的一次构建。就我个人而言,我会同意这一点

  • 这是一个等待答案的关于某种智能测试运行程序的问题,它为每个测试创建了所需的最小上下文


  • 考虑将
    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,它在创建时向数据库添加一些记录,然后代码的某些部分稍后读取该记录。作为一名开发人员,您可能能够发现这样的依赖关系,但您不能自动做到这一点——这相当于停止问题