为不同场景配置模拟对象的状态



我有一个DAO和一个服务类。在服务类CapService中,我有一个@Autowired,它是DAO类apDAO类有一个类型为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

就我个人而言,我会建议反思。

相关内容

  • 没有找到相关文章

最新更新