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

标签 java spring attributes mockito

我有一个 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类。

所以,我的问题是 - 有什么方法可以配置 expiryTimeCapDAO类,创建两个不同的实例,或者可能只在一个实例中,并将它们注入(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/

相关文章:

.net - 我应该将服务属性应用于接口(interface)、具体类还是两者?

Spring集成TCP,强制重连

java - 如何定义 RequestMapping 优先级

c# - 需要 PostSharp 的免费模拟

java - 如何在另一个Java项目中使用整个Java项目并实例化和使用类和方法?

Spring MVC 3.1 - REST Web 服务版本控制

python - 最大递归深度超出 getter Django

java - 如何使用 Stream API 从对象中检索嵌套列表?

java - 解析 joda-time

java - 如何将参数从 getBean 传递到使用 @Bean 注释创建的 bean?