为不同的方案配置模拟对象的状态

时间:2014-02-27 12:36:17

标签: java spring attributes mockito

我有一个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的任何设定者。是的,我知道我可以使用反射,但我想保留它作为我的最后手段。

1 个答案:

答案 0 :(得分:1)

简短回答

反射是最容易的,你可以简单地使用ReflectionTestUtil。注意:如果您有CapDAO实现的界面,您还需要AopUtils

答案很长

如果您不想使用反射,则需要将您的上下文和测试分开才能完成这项工作:

// context1.xml
<context:property-placeholder location="classpath:test1.properties"/>
// context2.xml
<context:property-placeholder location="classpath:test2.properties"/>

然后,您可以在属性中使用其他值定义someProperty

我个人会推荐反思。