我有一个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,以创建两个不同的实例,或者可以仅在单个实例中,并根据情况将其注入CapService中?不,我没有expiryTime的二传手。是的,我知道我可以使用反射,但是我想保留它作为我的最后选择。

最佳答案

简短答案

反射是最容易的可能性,您可以简单地使用ReflectionTestUtil。注意:如果您有CapDAO实施的接口,则还需要AopUtils

长答案

如果您不想使用反射,则需要分离上下文并进行测试才能完成此工作:

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


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

我个人将建议反思。

07-21 11:56