我想在集成测试中使用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()的情况下使用注释实现相同的结果?
发布于 2015-08-11 04:21:51
您是对的-- Spring不能将您的实例级引用与具有字段访问器的新引用交换;它由@Autowired
注释设置一次,然后所有内容都只引用该字段的单例。我相信您的问题可以通过使用Spring的lookup-method
属性来解决,示例如下:Java code geeks
https://stackoverflow.com/questions/31928036
复制相似问题