В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
Попробуйте HttpUnit, хотя Вы, вероятно, закончите тем, что писали автоматизированные тесты, которые являются большим количеством 'интеграционных тестов' (модуля), чем 'модульные тесты' (единого класса).
Большую часть времени я тестирую Сервлеты и JSP's через 'Интеграционные тесты', а не чистые Модульные тесты. Существует большое количество дополнений для JUnit/TestNG, доступного включая:
Это - тест JWebUnit для простого Сервлета Обработки заказов, который обрабатывает вход от формы 'orderEntry.html'. Это ожидает идентификатор клиента, имя клиента и один или несколько объектов порядка:
public class OrdersPageTest {
private static final String WEBSITE_URL = "http://localhost:8080/demo1";
@Before
public void start() {
webTester = new WebTester();
webTester.setTestingEngineKey(TestingEngineRegistry.TESTING_ENGINE_HTMLUNIT);
webTester.getTestContext().setBaseUrl(WEBSITE_URL);
}
@Test
public void sanity() throws Exception {
webTester.beginAt("/orderEntry.html");
webTester.assertTitleEquals("Order Entry Form");
}
@Test
public void idIsRequired() throws Exception {
webTester.beginAt("/orderEntry.html");
webTester.submit();
webTester.assertTextPresent("ID Missing!");
}
@Test
public void nameIsRequired() throws Exception {
webTester.beginAt("/orderEntry.html");
webTester.setTextField("id","AB12");
webTester.submit();
webTester.assertTextPresent("Name Missing!");
}
@Test
public void validOrderSucceeds() throws Exception {
webTester.beginAt("/orderEntry.html");
webTester.setTextField("id","AB12");
webTester.setTextField("name","Joe Bloggs");
//fill in order line one
webTester.setTextField("lineOneItemNumber", "AA");
webTester.setTextField("lineOneQuantity", "12");
webTester.setTextField("lineOneUnitPrice", "3.4");
//fill in order line two
webTester.setTextField("lineTwoItemNumber", "BB");
webTester.setTextField("lineTwoQuantity", "14");
webTester.setTextField("lineTwoUnitPrice", "5.6");
webTester.submit();
webTester.assertTextPresent("Total: 119.20");
}
private WebTester webTester;
}
Вы называете doPost и doGet методы вручную в модульных тестах? Раз так можно переопределить методы HttpServletRequest для обеспечения фиктивных объектов.
myServlet.doGet(new HttpServletRequestWrapper() {
public HttpSession getSession() {
return mockSession;
}
...
}
HttpServletRequestWrapper является классом Java удобства. Я предлагаю, чтобы Вы создали служебный метод в своих модульных тестах для создания ложных запросов HTTP:
public void testSomething() {
myServlet.doGet(createMockRequest(), createMockResponse());
}
protected HttpServletRequest createMockRequest() {
HttpServletRequest request = new HttpServletRequestWrapper() {
//overrided methods
}
}
еще лучше поместить ложные методы создания в основной суперкласс сервлета и сделать все модульные тесты сервлетов для расширения его.
Mockrunner ( http://mockrunner.sourceforge.net/index.html ) может сделать это. Это обеспечивает ложный контейнер J2EE, который может использоваться для тестирования Сервлетов. Это может также привыкнуть к модульному тесту другой серверный код как EJBs, JDBC, JMS, Struts. Я только использовал JDBC и возможности EJB сам.