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