Как написать тест для сервлета GWT? - PullRequest
4 голосов
/ 16 марта 2011

У меня есть приложение GWT, с несколькими сервлетами на стороне сервера. Я хотел бы протестировать эти сервлеты (без необходимости делать тесты GUI с Selenium или любым другим веб-фреймворком). Или, другими словами, я хочу, чтобы тест имитировал клиентскую сторону GWT.

Естественные проблемы с тестированием сервлетов:

  1. Запуск веб-сервера,
  2. Моделирование клиента,
  3. Сервлеты возвращаются немедленно, передавая значение объекту AsyncCallback.

Пока мне удалось выяснить (хотя это еще не проверено), что: 1. Я могу запустить контейнер, расширив GWTTestCase 3. Я нашел документ Google о асинхронном тестировании , поэтому можно ждать асинхронного обратного вызова. Документы Google также упоминают это:

Тестирование на стороне сервера

Тесты, описанные выше, предназначены для помощи в тестировании кода на стороне клиента. Оболочка тестового набора GWTTestCase запустит сеанс в режиме разработки или веб-браузер для проверки сгенерированного JavaScript. С другой стороны, серверный код выполняется как собственная Java в JVM без преобразования в JavaScript, поэтому нет необходимости запускать тесты серверного кода, используя GWTTestCase в качестве базового класса для ваших тестов. Вместо этого используйте TestCase JUnit и другие связанные классы непосредственно при написании тестов для кода на стороне сервера вашего приложения. При этом вам может потребоваться покрытие кода GWTTestCase и TestCase, которое будет использоваться как на клиенте, так и на сервере.

Но нет примеров или более подробного объяснения, как этого достичь.

Я не понял, как симулировать клиента ... Есть идеи, как мне это сделать?

Или, если это не способ сделать это, есть ли другой способ? Я бы предпочел использовать собственные классы GWT, а не какие-то сторонние фреймворки для тестирования сервлетов.

Спасибо!

1 Ответ

4 голосов
/ 10 июня 2011

Как насчет использования встроенного экземпляра Jetty ... Сервер Jetty в любом случае включен в GWT SDK. Так что просто включите gwt-dev.jar в ваш проект, и вы перейдете на сторону сервера. Эмуляция клиентской стороны - это совсем другая история. Проблема заключается в сериализации / десериализации JavaScript в Java, которая происходит в магии GWT ....

Существует проект gwt-syncproxy, который может помочь здесь: http://code.google.com/p/gwt-syncproxy/

В коде это может выглядеть так:

import junit.framework.Assert;

import org.junit.BeforeClass;
import org.junit.Test;

import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;

import com.gdevelop.gwt.syncrpc.SyncProxy;

public class ServletTest {

    private Server _server;

    @BeforeClass
    public void setUp() throws Exception {
        _server = new Server(8080);
        Context root = new Context(_server, "/", Context.SESSIONS);
        root.addServlet(new ServletHolder(new MyServiceImpl()), "/servlet");
        _server.start();
    }

    @Test
    public void testMethod1() throws Exception {
        MyService rpcService = (MyService) SyncProxy.newProxyInstance(MyService.class, "http://127.0.0.1:8080/servlet", "testMethod1");

        String result = rpcService.testMethod1();

        Assert.assertTrue(result != null);
    }

}
...