我有一个单元测试,尝试遵循发现的here单元测试说明。我发现,我保留的所有实体实际上都存储在与我的Google Project相关联的“真实” Google Cloud Platform数据存储中。
我的目的是将实体保存到内存中,并在每次测试后拆除。
运行测试时,它似乎尝试写入本地数据存储,但是最终所有内容最终都被写入了Cloud Datastore。这是控制台输出
com.google.appengine.api.datastore.dev.LocalDatastoreService初始化 INFO:本地数据存储已初始化: 类型:高复制 存储:内存中 2019年1月9日10:44:49 com.google.appengine.api.datastore.dev.LocalDatastoreService初始化 INFO:本地数据存储已初始化: 类型:高复制 存储:内存中
这是我的单元测试
public class AccountGCPDatastoreDaoTest {
private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy());
private Closeable session;
private AccountGCPDatastoreDao dao = new AccountGCPDatastoreDao();
@BeforeClass
public static void setUpBeforeClass() {
System.out.println("init Objectify");
ObjectifyService.init(new ObjectifyFactory());
ObjectifyService.register(Account.class);
}
@Before
public void setUp() { ;
helper.setUp();
session = ObjectifyService.begin();
}
@After
public void tearDown() {
session.close();
helper.tearDown();
}
@Test
public void save() {
Account account = new Account(1L, "Test Account", false, AccountType.SMALL);
dao.save(account);
Account retAcc = ofy().load().type(Account.class).id(1).now();
assertEquals(new Long(1),retAcc.getId());
assertEquals("Test Account",retAcc.getName());
assertFalse(retAcc.getPaidSubscription());
assertEquals(AccountType.SMALL,retAcc.getAccountType());
}
@Test
public void findAccountsForRegistration_NoAccountsExist() {
List<Account> accountsForRegistration = dao.findAccountsForRegistration();
assertEquals(0,accountsForRegistration.size());
}
我的帐户实体:
@Entity
public class Account {
@Id private Long id;
private String name;
private boolean paidSubscription;
@Index private AccountType accountType;
private Account(){}
public Account(Long id,
String name,
boolean paidSubscription,
AccountType accountType){
this.id = id;
this.name = name;
this.paidSubscription = paidSubscription;
this.accountType = accountType;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public AccountType getAccountType(){
return accountType;
}
public boolean getPaidSubscription() {
return paidSubscription;
}
}
答案 0 :(得分:1)
看起来您正在使用Objectify6,它使用了新的专用数据存储区API,但是您正在查看旧的appengine-everything-combined API的文档。
新的数据存储区API具有完全不同的模拟器。您正在使用的本地测试工具就是与Objectify5一起使用的工具,或者曾经被称为“ appengine数据存储库低级API”的工具。
我上次查看有关为新API设置测试环境的文档并不理想。我建议查看Objectify的测试工具本身。如果要从JUnit4升级,则实际上可以直接使用Objectify JUnit5拦截器。否则,弄清楚正在发生的事情应该很容易。
这是它的实质:
https://github.com/objectify/objectify/blob/master/src/test/java/com/googlecode/objectify/test/util/LocalDatastoreExtension.java https://github.com/objectify/objectify/blob/master/src/test/java/com/googlecode/objectify/test/util/ObjectifyExtension.java