JUnit Test кода, который использует GAE/J URLFetchServiceFactory.getURLFetchService()

У меня есть код, который я развертываю в Google App Engine — Java (GAE/J), в котором используется расширение URLFetchService. Я хотел бы использовать JUnit для тестирования этого кода. Судя по документации по тестированию, я должен был тест, который использует их класс LocalURLFetchServiceTestConfig ПРИМЕРНО следующим образом:

public class MyRemoteServiceTests {
    private static final LocalURLFetchServiceTestConfig urlConfig = new LocalURLFetchServiceTestConfig();
    private static final LocalServiceTestHelper helper = 
        new LocalServiceTestHelper(urlConfig);
    
    @Before
    public void setUp() throws Exception {
        service = new SampleService();
        helper.setUp();
    }

    @After
    public void tearDown() throws Exception {
        service = null;
        helper.tearDown();
    }

    @Test
    public void testThatCallsCodeThatUsesUrlFetch() {
            Object data = service.getRemoteDataUsingUrlFetch("foo", "bar");
            Assert.assertNotNull(data);
    }

}

Я обнаружил, что этот тест продолжает давать сбои, несмотря на использование помощника, как это предлагается в документации GAE/J по тестированию: The API package 'urlfetch' or call 'Fetch()' was not found..

Я предполагал, что использование помощника каким-то образом настроит среду GAE таким образом, что когда я вызываю URLFetchServiceFactory.getURLFetchService() из моего метода getRemoteDataUsingUrlFetch, возвращаемый интерфейс будет экземпляром LocalURLFetchService, который просто будет работать, но, похоже, это НЕ так.

  • Как я могу протестировать этот код?
  • Я что-то пропустил? (Я новичок в GAE...)
  • Должен ли я реорганизовать мой getRemoteDataUsingUrlFetch, чтобы он не использовал URLFetchServiceFactory.getURLFetchService(), потому что это делает его непроверяемым локально??? (Звучит так, будто это было бы действительно отстойно...)

Любая помощь/предложения высоко ценится!


person jandersen    schedule 17.03.2011    source источник


Ответы (2)


На самом деле оказалось, что моя проблема заключалась в том, что я не включил два дополнительных jar-файла, упомянутых в Локальное модульное тестирование документации. РТМ ФТВ!

  • appengine-local-runtime.jar
  • appengine-api-stubs.jar
person jandersen    schedule 18.03.2011
comment
Рад, что ты понял это. Мой предыдущий ответ, вероятно, был нецелевым :( - person aldrin; 18.03.2011

afaik, LocalURLFetchService не настраивает GAE, как вы ожидаете. Однако это скорее способ получить URL-адрес от локального разработчика, а затем обработать содержимое. (Аналогичным образом даже LocalDatastoreService и LocalMemcacheService работают в изолированных пространствах в тестовой среде). Один из способов протестировать ваш код — реорганизовать getRemoteDataUsingUrlFetch(), чтобы, возможно, взять содержимое ответа URL. что-то вроде,

URLFetchResponse resp = LocalURLFetchService.fetch(status, request)

getRemoteDataUsingUrlFetch(foo, bar, resp)
person aldrin    schedule 17.03.2011
comment
Хм... вот что меня немного волновало. Есть ли хороший способ определить, работает ли код в реальной среде GAE или нет, чтобы я мог написать простой интерфейс вокруг URLFetchService и прозрачно использовать соответствующую реализацию? - person jandersen; 17.03.2011
comment
Чтобы определить, работаете ли вы в среде разработки или в реальной среде, проверьте системное свойство var 'com.google.appengine.runtime.environment'. это будет либо «Производство», либо «Разработка». См. также code.google.com/appengine/docs/java/ - person aldrin; 17.03.2011
comment
Оказывается, я идиот, недостаточно внимательно прочитал документацию и упустил тот факт, что мне нужно было добавить дополнительные банки в мой путь к классам... дох! Смотрите мой ответ ниже. - person jandersen; 18.03.2011