Юнит-тесты Objectify сохраняют данные в Google Cloud Datastore. - PullRequest
0 голосов
/ 09 января 2019

У меня есть модульный тест, который пытается следовать найденным инструкциям модульного теста здесь . Я обнаружил, что любые сохраняемые мной объекты на самом деле хранятся в «реальном» хранилище данных Google Cloud Platform, связанном с моим Проектом Google.

Мое намерение состояло в том, чтобы сущности сохранялись во встроенной памяти и уничтожались после каждого теста.

При запуске теста выясняется, что он пытается записать данные в локальное хранилище данных, но все каким-то образом заканчивается записью в хранилище данных Cloud. Вот консольный вывод

com.google.appengine.api.datastore.dev.LocalDatastoreService init ИНФОРМАЦИЯ: Инициализировано локальное хранилище данных: Тип: Высокая Репликация Хранение: в памяти 09 января 2019 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());


}

Моя учетная запись:

@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 голосов
/ 09 января 2019

Похоже, вы используете Objectify6, который использует новый выделенный API хранилища данных, но вы просматриваете документацию для старого API-интерфейса, объединяющего все устройства.

Новый API хранилища данных имеет совершенно другой эмулятор. То, что вы используете для локального тестирования - это то, что вы использовали бы с Objectify5 или то, что раньше называлось «API-интерфейс низкого уровня хранилища данных appengine».

Документация по настройке тестовой среды для нового API не была великолепной в прошлый раз, когда я выглядел. Я рекомендую взглянуть на сам тестовый жгут Objectify. На самом деле вы можете напрямую использовать перехватчики Objectify JUnit5, если хотите обновить JUnit4. В противном случае не должно быть слишком сложно понять, что происходит.

Вот мясо этого:

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

...