Objectify单元测试会将数据持久保存到Google Cloud Datastore

时间:2019-01-09 10:57:47

标签: java google-cloud-platform google-cloud-datastore objectify

我有一个单元测试,尝试遵循发现的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;
}

}

1 个答案:

答案 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