我有一个DAO和一个服务类。在服务类CapService中,我有一个@Autowired
,它是DAO类int
的私有实例字段,该字段的值使用@Value
注释从属性文件注入。
class CapDAO {
@Value("${someProperty}")
private int expiryTime;
}
class CapService {
@Autowired
private CapDAO capDAO;
}
CapDAO
类中有一个方法retrieveCap()
,它基于expiryTime
从数据库中检索caps。该方法是从CapService
类中的另一个方法调用的。
CapService
类使用从DAO方法返回的列表来创建另一个包装该列表的对象。最后,它返回该数据结构。
现在,我正在使用Mockito
框架测试一个场景。我有两种情况。在这两种情况下,我都想调用CapService
类的方法,它将为我获取对象。从数据库检索的列表将取决于CapDAO
类中expiryTime
的值。CapService
类方法返回的对象的内容也是如此。
在测试中,我调用Service
类中的方法,并检查返回的值。由于DAO正在从属性文件中读取expiryTime
,所以两个测试场景都不能通过相同的配置值。我必须将两个不同配置的DAO
实例注入到Service
类中。
所以,我的问题是——有没有什么方法可以在CapDAO
类中配置expiryTime
,创建两个不同的实例,或者可能只在一个实例中,并根据场景将它们注入CapService
中?不,我没有expiryTime
的二传手。是的,我知道我可以使用反射,但我想把它作为我的最后手段。
简短回答
反射是最简单的可能性,您可以简单地使用ReflectionTestUtil。注意:如果你有一个CapDAO实现的接口,你还需要AopUtils
长答案
如果你不想使用反射,你需要分开你的上下文和测试来完成这项工作:
// context1.xml
<context:property-placeholder location="classpath:test1.properties"/>
// context2.xml
<context:property-placeholder location="classpath:test2.properties"/>
然后可以在属性中使用其他值定义someProperty
。
就我个人而言,我会建议反思。