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