我不确定我是否应该完全不这样做,但我通常习惯于模拟应用程序的很多区域,并且在我的实体内部使用 Ref 和 Keys 时遇到问题。
我遵循了 docs 中的模式你在实体中使用 ref 但你屏蔽了 ref 以便你可以访问它引用的驱动程序对象,如下所示:
@Entity
class Car {
@Id Long id;
@Load Ref<Person> driver; // Person is an @Entity
public Person getDriver() { return driver.get(); }
public void setDriver(Person value) { driver = Ref.create(value); }
}
我的特定场景是与一个导入器合作,我在其中解析 xml 并构建我的实体以准备保存它们。由于我的单元测试只是实际测试 xml 的导入和解析,所以我模拟了我的 dao 实现,这样我就不会真正使用数据存储。
然后我在调用 setDriver 时遇到了问题,它只是创建了一个 Ref 对象。然后我使用 getDriver 方法,该方法将返回 null,因为 Ref.get 直接依赖于数据存储。
有没有人遇到过这个问题,有没有办法创建一个模拟 Ref 对象?我正在考虑在我的实体中不直接引用 Ref,而是引用一个可以提供我在测试中可以控制的 Ref 的辅助类?
最佳答案
选项的简短列表是:
- 使用 PowerMock
- 添加您自己的 RefCreator 对象
- 使用假数据存储而不是模拟
我从不 mock 数据存储层。本地单元测试工具是 GAE 最好的东西之一;它为您提供了一个功能齐全的数据存储区:
https://cloud.google.com/appengine/docs/java/tools/localunittesting
关于java - 使用 objectify 实体模型进行模拟测试时的 Ref & Key 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28559216/