AppEngine Objectify Ошибка кэширования объекта модульного Java - PullRequest
0 голосов
/ 27 мая 2018

AppEngine Objectify Java Unit Test выдает странную ошибку кэша сеанса, как описано ниже.

Тестовый пример:

private final LocalServiceTestHelper helper = new LocalServiceTestHelper(
        new LocalDatastoreServiceTestConfig());

protected Closeable session;

@Before
public void setUp() throws Exception {        
    helper.setUp();

    ObjectifyService.setFactory(new ObjectifyFactory());
    ObjectifyService.register(UserData.class);
    session = ObjectifyService.begin();
}

@After
public void tearDown() throws Exception {
    session.close();
    helper.tearDown();
}

@Test
public void testUserDataQuery throws Exception {
    ...
    saveUserData();
    ...
    getUserData();
    ...
}

Вызов 1:

UserData saveUserData {

    ...
    UserData userData = (UserData) ofy().load().key(key).now();
    ...

    // UserData is modified, the modifications are not stored in datastore,
    // as those are temporary.

    return userData;
}

Вызов 2:

UserData getUserData {

    ...
    UserData userData = (UserData) ofy().load().key(key).now();
    ...

    // Return the datastore saved UserData object.
    return userData;
}

Когда выполняется тест модульного теста, изменение, выполненное в вызове saveUserData, отображается в запросе getUserData.Несмотря на то, что был вызван ofy().load(), UserData не загружается из хранилища данных, а обслуживается из кэшированной записи.

Я попытался ofy().clear() вызвать очистить кэш сеанса.Это не исключает ошибки во всех случаях.

Это происходит только в среде модульного тестирования, а не на сервере разработки или производства.

1 Ответ

0 голосов
/ 28 мая 2018

В коде, который вы разместили, да, вы получите тот же объект обратно - так работает кеш сессии.Очистка кэша сеанса после сохранения действительно даст вам новый объект, загруженный из хранилища данных (или memcache).Но я предполагаю, что это не то, что вы действительно хотите проверить.

Я дико предполагаю, что вы пытаетесь смоделировать несколько вызовов бэкэнда в своем тесте.IRL, каждый внутренний вызов будет работать в своем собственном контексте на стороне сервера.Поэтому я рекомендую создавать контекст для каждого вызова с использованием замыканий:

@Test
public void testUserDataQuery throws Exception {
    ...
    req(() -> saveUserData());
    ...
    req(() -> getUserData());
    ...
}

Где req() делает начало () / закрытие () контекста Objectify (а также любого другого запроса)обработка вашего контейнера обычно делает).Вы можете оставить инициализацию Objectify в до / после.

...