Java Objectify单元测试将数据持久化到Google云数据存储

Java Objectify单元测试将数据持久化到Google云数据存储,java,google-cloud-platform,google-cloud-datastore,objectify,Java,Google Cloud Platform,Google Cloud Datastore,Objectify,我有一个单元测试,它试图遵循找到的单元测试说明。我发现我保存的任何实体实际上都存储在与我的谷歌项目相关联的“真实”谷歌云平台数据存储中 我的意图是将实体持久化到内存存储中,并在每次测试后将其拆下 当测试运行时,它似乎试图写入本地数据存储,但最终所有内容都写入了云数据存储。这是控制台输出 com.google.appengine.api.datastore.dev.LocalDatastoreService init 信息:已初始化本地数据存储: 类型:高复制 存储:在内存中 2019年1月9日上

我有一个单元测试,它试图遵循找到的单元测试说明。我发现我保存的任何实体实际上都存储在与我的谷歌项目相关联的“真实”谷歌云平台数据存储中

我的意图是将实体持久化到内存存储中,并在每次测试后将其拆下

当测试运行时,它似乎试图写入本地数据存储,但最终所有内容都写入了云数据存储。这是控制台输出

com.google.appengine.api.datastore.dev.LocalDatastoreService init 信息:已初始化本地数据存储: 类型:高复制 存储:在内存中 2019年1月9日上午10:44:49 com.google.appengine.api.datastore.dev.LocalDatastoreService init 信息:已初始化本地数据存储: 类型:高复制 存储:在内存中

这是我的单元测试

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());


}

}

看起来您正在使用Objectify6,它使用了新的专用数据存储API,但您正在查看旧appengine Everythine API的文档

新的数据存储API有一个完全不同的模拟器。您正在使用的本地测试工具是Objectify5或以前称为“appengine数据存储低级API”的工具

上次我看的时候,为新API设置测试环境的文档不是很好。我建议查看Objectify的测试工具本身。如果要从JUnit4升级,实际上可以直接使用Objectify JUnit5拦截器。否则就不难弄清楚到底发生了什么

下面是它的要点:


看起来您正在使用Objectify6,它使用了新的专用数据存储API,但您正在查看旧appengine Everythine API的文档

新的数据存储API有一个完全不同的模拟器。您正在使用的本地测试工具是Objectify5或以前称为“appengine数据存储低级API”的工具

上次我看的时候,为新API设置测试环境的文档不是很好。我建议查看Objectify的测试工具本身。如果要从JUnit4升级,实际上可以直接使用Objectify JUnit5拦截器。否则就不难弄清楚到底发生了什么

下面是它的要点:


谢谢@stickfigure-我就是这么做的。我转到JUnit5(不像我希望的那么容易),并实现了您建议的JUnit5拦截器。情况好多了,但是我现在得到了一个超时,memcached尝试连接到localhost/127.0.0.1:11211-它会恢复并运行测试,但是你知道如何摆脱这种烦恼吗?我只是在本地运行memcached。但是您可以在不使用memcached的情况下构建ObjectifyFactory;它会禁用缓存,这可能对您的测试很好。谢谢@stickfigure-这正是我正在做的。我转到JUnit5(不像我希望的那么容易),并实现了您建议的JUnit5拦截器。情况好多了,但是我现在得到了一个超时,memcached尝试连接到localhost/127.0.0.1:11211-它会恢复并运行测试,但是你知道如何摆脱这种烦恼吗?我只是在本地运行memcached。但是您可以在不使用memcached的情况下构建ObjectifyFactory;它会禁用缓存,这可能对您的测试很好。
@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;
}