Предварительная загрузка данных приемочного тестирования в хранилище данных сервера разработки GAE - PullRequest
4 голосов
/ 22 января 2011

В моем приложении есть набор DAO, которые я внедряю в свой прикладной уровень. Для приемочного теста, который я пишу, я хочу предварительно загрузить хранилище данных dev_server с данными, поэтому я использую ту же конфигурацию Spring в своем тесте JUnit (используя аннотацию @ContextConfiguration), чтобы вставить экземпляр соответствующего DAO в мой тест. Когда я на самом деле иду, чтобы сохранить некоторые данные, например:

dao.add(entity)

Я получаю страшное "Нет среды API, зарегистрированной для этой темы."

Caused by: java.lang.NullPointerException: No API environment is registered for this thread.
 at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId(DatastoreApiHelper.java:108)
 at com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace(DatastoreApiHelper.java:118)
    ....

Вероятно, это связано с тем, что мой контрольный пример не прочитал в GAE application-web.xml подробности приложения (хотя я предполагаю, что здесь я действительно могу ошибаться); поэтому он не знает, что записать в то же хранилище данных, в которое приложение, запущенное на сервере dev_server, выполняет чтение / запись.

Как я могу заставить мой тест "указывать" на то же хранилище данных, что и приложение? Есть ли какой-нибудь механизм источника данных, который я могу внедрить как в приложение, так и в тест? Есть ли способ заставить мой тест заставить API хранилища данных прочитать нужный конфиг?

Ответы [ 3 ]

3 голосов
/ 23 января 2011

Здесь - это страница, рассказывающая о том, как выполнять модульные тесты, которые подключаются к хранилищу данных dev.Это то, что вы ищете?В основном речь идет о двух классах, LocalServiceTestHelper и LocalDatastoreServiceTestConfig, которые можно использовать для настройки среды для тестирования.Хотя приведенный пример предназначен для модульных тестов, я считаю, что он также подойдет для вашей ситуации.

Затем вы можете настроить такие вещи, как, если хранилище данных dev записывается на диск или просто сохраняется в памяти (для более быстрых тестов).Если вы хотите, чтобы эти данные отправлялись в то же место, что и ваш сервер разработки, вы, вероятно, захотите изменить это, так как я думаю, что по умолчанию используется опция «в памяти».Если вы посмотрите на javadoc , то есть метод setBackingStoreLocation, где вы можете указать на любой файл, который вам нужен.

0 голосов
/ 27 августа 2013

Я нашел обходной путь, хотя он не очень хорош, потому что каждый метод тестирования не очищает хранилище данных, как описано в статье Локальное модульное тестирование для Java , однако хранилище данных начинает очищаться каждый раз, когда запускается класс Test, это не так уж и плохо, при условии, что вы осторожны с этим.

Проблема в том, что при использовании SpringJUnit4ClassRunner среда пружины создается до того, как аннотация @Before может быть запущена, решение состоит в использовании @BeforeClass и использовании статической переменной для LocalServiceTestHelper, чтобы их создать до настройки среды Spring.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:META-INF/spring/context-test.xml")
@Transactional
public class MyTest {


    @Inject
    private MyService myService;

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

    @BeforeClass
    public static void beforeClass() {
        helper.setUp();
    }

    @AfterClass
    public static void afterClass() {
        helper.tearDown();
    }

Если у кого-нибудь есть лучшее решение, я буду рад услышать!

0 голосов
/ 02 февраля 2011

Я нашел решение !!!!

По некоторым причинам поля Namespace, AppID и AuthDomain тестового хранилища данных должны совпадать с полями dev_server, тогда dev_server может видеть объекты, вставленные тестом.

Вы можете увидеть значения для среды (dev_server или тестовый код) с помощью следующих операторов

System.out.println(NamespaceManager.get());
System.out.println(ApiProxy.getCurrentEnvironment().getAppId());
System.out.println(ApiProxy.getCurrentEnvironment().getAuthDomain());

В вашем экземпляре LocalServiceTestHelper (например, gaeHelper) вы можете установить значения для тестовой среды

// the NamespaceManager is thread local.
NamespaceManager.set(NamespaceManager.getGoogleAppsNamespace());
gaeHelper.setEnvAppId(<the name of your app in appengine-web.xml>);
gaeHelper.setEnvAuthDomain("gmail.com");

Тогда dev_server увидит ваши сущности. Однако из-за проблем с синхронизацией, если тест запишет в хранилище данных после того, как dev_server был запущен, dev_server не увидит его, если его не заставят перечитать файл (который я еще не выяснил). В противном случае сервер должен быть перезапущен.

...