首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用不同的spring上下文为junit集成测试创建同一对象的多个实例?

如何使用不同的spring上下文为junit集成测试创建同一对象的多个实例?
EN

Stack Overflow用户
提问于 2015-08-11 03:55:39
回答 1查看 1.3K关注 0票数 2

我想在集成测试中使用spring注解来加载具有不同applicationContexts的同一对象的不同实例(但使用相同的配置xml)。下面是一个简单的例子来表示我的问题:

我的junit测试如下所示:

代码语言:javascript
运行
复制
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:CarContext.xml")
public class CarRaceTest
{
    @Autowired
    Car car1;

    @Autowired
    Car car2;

    @Test
    public void test()
    {
        car1.displayParts();
        car2.displayParts();
    }

}

我的汽车类:

代码语言:javascript
运行
复制
@Component
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public class Car
{
    @Autowired
    private ElectricalSystem electricalSystem;

    @Autowired
    private Alternator alternator;

    public void displayParts()
    {
        System.out.println("Parts for car: " + this.toString());
        System.out.println(electricalSystem.toString());
        System.out.println(alternator.toString());
    }

    public void raceQuarterMile()
    {
    }
}

ElectricalSystem类:

代码语言:javascript
运行
复制
@Component
public class ElectricalSystem
{
    @Autowired
    private Alternator alternator;
}

交流发电机类:

代码语言:javascript
运行
复制
@Component
public class Alternator
{
}

CarContext.xml的内容

代码语言:javascript
运行
复制
    <context:component-scan base-package="springTest"/>

正如您可以从单个汽车的示例中看到的,交流发电机可能会被多个其他组件/系统引用-所有这些组件/系统都需要引用一个单独的实例。然而,对于我的集成测试,为了让两辆车相互竞争,我需要每辆车都有自己的应用程序上下文,所以我在每辆车中都有不同的交流发电机。

这是我从上面的代码中得到的输出:

代码语言:javascript
运行
复制
Parts for car: springTest.Car@3ea20bc2
springTest.ElectricalSystem@b20dae
springTest.Alternator@29a01add
Parts for car: springTest.Car@4e43b884
springTest.ElectricalSystem@b20dae
springTest.Alternator@29a01add

注意到我的两辆车有完全相同的电气系统和交流发电机--这不是我想要的。

在两个不同的应用程序上下文中使用context.getBean时,我已经能够让它在以下Junit中按预期工作:

代码语言:javascript
运行
复制
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:CarContext.xml")
public class CarRaceTest
{

    private String contextFile = "classpath:CarContext.xml";

    private ApplicationContext appContext1;
    private ApplicationContext appContext2;

    Car car1;
    Car car2;

    public CarRaceTest()
    {
        this.appContext1 = new FileSystemXmlApplicationContext(this.contextFile);
        this.appContext2 = new FileSystemXmlApplicationContext(this.contextFile);
    }

    @Test
    public void test()
    {
        car1 = appContext1.getBean(Car.class);
        car2 = appContext2.getBean(Car.class);

        car1.displayParts();
        car2.displayParts();
    }
}

输出如下:

代码语言:javascript
运行
复制
Parts for car: springTest.Car@247de4f1
springTest.ElectricalSystem@45419cee
springTest.Alternator@56a5f0c7
Parts for car: springTest.Car@2862c542
springTest.ElectricalSystem@6c8484c4
springTest.Alternator@70289784

如何在不调用.getbean()的情况下使用注释实现相同的结果?

EN

回答 1

Stack Overflow用户

发布于 2015-08-11 04:21:51

您是对的-- Spring不能将您的实例级引用与具有字段访问器的新引用交换;它由@Autowired注释设置一次,然后所有内容都只引用该字段的单例。我相信您的问题可以通过使用Spring的lookup-method属性来解决,示例如下:Java code geeks

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

https://stackoverflow.com/questions/31928036

复制
相关文章

相似问题

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