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

时间:2015-08-10 19:55:39

标签: java spring junit integration

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

我的junit测试看起来像这样:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:CarContext.xml")
public class CarRaceTest
{
    @Autowired
    Car car1;

    @Autowired
    Car car2;

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

}

我的汽车课:

@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类:

@Component
public class ElectricalSystem
{
    @Autowired
    private Alternator alternator;
}

交流发电机类:

@Component
public class Alternator
{
}

CarContext.xml的内容

    <context:component-scan base-package="springTest"/>

从单个汽车的示例中可以看出,交流发电机可能被多个其他组件/系统引用 - 所有这些都需要引用单个实例。然而,对于我的集成测试来说,两辆车相互对抗,我需要每辆车都有自己的应用环境,所以每辆车都有不同的交流发电机。

这是我获得上述代码的输出:

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工作:

@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();
    }
}

使用以下输出:

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()的情况下使用注释完成相同的结果?

1 个答案:

答案 0 :(得分:1)

你是对的 - Spring无法将你的实例级别引用与具有字段访问器的新引用交换;它由@Autowired注释设置一次,然后所有内容都只引用该字段的单例。我相信您的问题可以使用Spring的lookup-method属性来解决,在这里举例说明:Java code geeks

相关问题