Jak przetestować mój serwlet za pomocą JUnit

112

Stworzyłem system WWW przy użyciu Java Servlets i teraz chcę przeprowadzić testy JUnit. My dataManagerto tylko podstawowy fragment kodu, który przesyła go do bazy danych. Jak przetestowałbyś serwlet z JUnitem?

Mój przykład kodu, który umożliwia użytkownikowi rejestrację / rejestrację, który jest przesyłany z mojej strony głównej za pośrednictwem AJAX:

public void doPost(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, IOException{

    // Get parameters
    String userName = request.getParameter("username");
    String password = request.getParameter("password");
    String name = request.getParameter("name");

    try {

        // Load the database driver
        Class.forName("com.mysql.jdbc.Driver");

        //pass reg details to datamanager       
        dataManager = new DataManager();
        //store result as string
        String result = dataManager.register(userName, password, name);

        //set response to html + no cache
        response.setContentType("text/html");
        response.setHeader("Cache-Control", "no-cache");
        //send response with register result
        response.getWriter().write(result);

    } catch(Exception e){
        System.out.println("Exception is :" + e);
    }  
}
Księżycowy
źródło

Odpowiedzi:

169

Możesz to zrobić za pomocą Mockito, aby makieta zwróciła poprawne parametry, zweryfikuj, czy rzeczywiście zostały wywołane (opcjonalnie określ liczbę razy), wpisz „wynik” i sprawdź, czy jest poprawny.

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.io.*;
import javax.servlet.http.*;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class TestMyServlet extends Mockito{

    @Test
    public void testServlet() throws Exception {
        HttpServletRequest request = mock(HttpServletRequest.class);       
        HttpServletResponse response = mock(HttpServletResponse.class);    

        when(request.getParameter("username")).thenReturn("me");
        when(request.getParameter("password")).thenReturn("secret");

        StringWriter stringWriter = new StringWriter();
        PrintWriter writer = new PrintWriter(stringWriter);
        when(response.getWriter()).thenReturn(writer);

        new MyServlet().doPost(request, response);

        verify(request, atLeast(1)).getParameter("username"); // only if you want to verify username was called...
        writer.flush(); // it may not have been flushed yet...
        assertTrue(stringWriter.toString().contains("My expected string"));
    }
}
aaronvargas
źródło
W ten sposób, jak zapewnić, że „Cache-Control” będzie ustawione w odpowiedzi?
Markus Schulte
34
Zamiast drukować do rzeczywistego pliku na dysku, możesz użyć StringWriter (jako parametru do konstruktora PrintWriter). Następnie assertTrue (stringWriter.toString (). Zawiera ("Mój oczekiwany ciąg")); W ten sposób test odczyta / zapisze pamięć zamiast dysku.
spg
@aaronvargas: Dziękuję za odpowiedź! Ale kiedy wykonuję twój kod, pojawia się następujący błąd: java.util.MissingResourceException: Nie można znaleźć pakietu dla nazwy podstawowej javax.servlet.LocalStrings, locale de_DE - dzieje się to podczas wykonywania nowej MyServlet (). DoPost ( ...). Każdy pomysł, co można zepsuć?
Benny Neugebauer
1
@BennyNeugebauer, wygląda na to, że pakietu nie ma na ścieżce klas. Napisałbym kolejny test JUnit, który pobiera wartość tylko z pakietu, aby wyodrębnić problem.
aaronvargas
@aaronvargas, dziękujemy za opinię! Znalazłem na to rozwiązanie. Musiałem "javax.servlet-api" do moich zależności w moim pom.xml.
Benny Neugebauer
49

Po pierwsze, w prawdziwej aplikacji nigdy nie uzyskasz informacji o połączeniu z bazą danych w serwlecie; można go skonfigurować na serwerze aplikacji.

Istnieją jednak sposoby testowania serwletów bez uruchomionego kontenera. Jednym z nich jest użycie pozorowanych obiektów. Spring dostarcza zestaw bardzo przydatnych makiet dla rzeczy takich jak HttpServletRequest, HttpServletResponse, HttpServletSession itp.

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html

Używając tych makiet, możesz przetestować takie rzeczy jak

Co się stanie, jeśli w żądaniu nie ma nazwy użytkownika?

Co się stanie, jeśli w żądaniu znajduje się nazwa użytkownika?

itp

Możesz wtedy zrobić takie rzeczy jak:

import static org.junit.Assert.assertEquals;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;

public class MyServletTest {
    private MyServlet servlet;
    private MockHttpServletRequest request;
    private MockHttpServletResponse response;

    @Before
    public void setUp() {
        servlet = new MyServlet();
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
    }

    @Test
    public void correctUsernameInRequest() throws ServletException, IOException {
        request.addParameter("username", "scott");
        request.addParameter("password", "tiger");

        servlet.doPost(request, response);

        assertEquals("text/html", response.getContentType());

        // ... etc
    }
}
Paul Croarkin
źródło
3

Uważam, że testy Selenium są bardziej przydatne w przypadku testów integracyjnych lub funkcjonalnych (od końca do końca). Pracuję nad próbą użycia org.springframework.mock.web , ale nie jestem zbyt daleko. Dołączam kontroler próbki z zestawem testów jMock .

Po pierwsze, Administrator:

package com.company.admin.web;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import com.company.admin.domain.PaymentDetail;
import com.company.admin.service.PaymentSearchService;
import com.company.admin.service.UserRequestAuditTrail;
import com.company.admin.web.form.SearchCriteria;

/**
 * Controls the interactions regarding to the refunds.
 * 
 * @author slgelma
 *
 */
@Controller
@SessionAttributes({"user", "authorization"})
public class SearchTransactionController {

    public static final String SEARCH_TRANSACTION_PAGE = "searchtransaction";

    private PaymentSearchService searchService;
    //private Validator searchCriteriaValidator;
    private UserRequestAuditTrail notifications;

    @Autowired
    public void setSearchService(PaymentSearchService searchService) {
        this.searchService = searchService;
    }

    @Autowired
    public void setNotifications(UserRequestAuditTrail notifications) {
        this.notifications = notifications;
    }

    @RequestMapping(value="/" + SEARCH_TRANSACTION_PAGE)
    public String setUpTransactionSearch(Model model) {
        SearchCriteria searchCriteria = new SearchCriteria();
        model.addAttribute("searchCriteria", searchCriteria);
        notifications.transferTo(SEARCH_TRANSACTION_PAGE);
        return SEARCH_TRANSACTION_PAGE;
    }

    @RequestMapping(value="/" + SEARCH_TRANSACTION_PAGE, method=RequestMethod.POST, params="cancel")
    public String cancelSearch() {
        notifications.redirectTo(HomeController.HOME_PAGE);
        return "redirect:/" + HomeController.HOME_PAGE;
    }

    @RequestMapping(value="/" + SEARCH_TRANSACTION_PAGE, method=RequestMethod.POST, params="execute")
    public String executeSearch(
            @ModelAttribute("searchCriteria") @Valid SearchCriteria searchCriteria,
            BindingResult result, Model model,
            SessionStatus status) {
        //searchCriteriaValidator.validate(criteria, result);
        if (result.hasErrors()) {
            notifications.transferTo(SEARCH_TRANSACTION_PAGE);
            return SEARCH_TRANSACTION_PAGE;
        } else {
            PaymentDetail payment = 
                searchService.getAuthorizationFor(searchCriteria.geteWiseTransactionId());
            if (payment == null) {
                ObjectError error = new ObjectError(
                        "eWiseTransactionId", "Transaction not found");
                result.addError(error);
                model.addAttribute("searchCriteria", searchCriteria);
                notifications.transferTo(SEARCH_TRANSACTION_PAGE);
                return SEARCH_TRANSACTION_PAGE;
            } else {
                model.addAttribute("authorization", payment);
                notifications.redirectTo(PaymentDetailController.PAYMENT_DETAIL_PAGE);
                return "redirect:/" + PaymentDetailController.PAYMENT_DETAIL_PAGE;
            }
        }
    }

}

Następnie test:

    package test.unit.com.company.admin.web;

    import static org.hamcrest.Matchers.containsString;
    import static org.hamcrest.Matchers.equalTo;
    import static org.junit.Assert.assertThat;

    import org.jmock.Expectations;
    import org.jmock.Mockery;
    import org.jmock.integration.junit4.JMock;
    import org.jmock.integration.junit4.JUnit4Mockery;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.ObjectError;
    import org.springframework.web.bind.support.SessionStatus;

    import com.company.admin.domain.PaymentDetail;
    import com.company.admin.service.PaymentSearchService;
    import com.company.admin.service.UserRequestAuditTrail;
    import com.company.admin.web.HomeController;
    import com.company.admin.web.PaymentDetailController;
    import com.company.admin.web.SearchTransactionController;
    import com.company.admin.web.form.SearchCriteria;

    /**
     * Tests the behavior of the SearchTransactionController.
     * @author slgelma
     *
     */
    @RunWith(JMock.class)
    public class SearchTransactionControllerTest {

        private final Mockery context = new JUnit4Mockery(); 
        private final SearchTransactionController controller = new SearchTransactionController();
        private final PaymentSearchService searchService = context.mock(PaymentSearchService.class);
        private final UserRequestAuditTrail notifications = context.mock(UserRequestAuditTrail.class);
        private final Model model = context.mock(Model.class);


        /**
         * @throws java.lang.Exception
         */
        @Before
        public void setUp() throws Exception {
            controller.setSearchService(searchService);
            controller.setNotifications(notifications);
        }

        @Test
        public void setUpTheSearchForm() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;

            context.checking(new Expectations() {{
                oneOf(model).addAttribute(
                        with(any(String.class)), with(any(Object.class)));
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.setUpTransactionSearch(model);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void cancelSearchTest() {

            final String target = HomeController.HOME_PAGE;

            context.checking(new Expectations(){{
                never(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                oneOf(notifications).redirectTo(with(any(String.class)));
            }});

            String nextPage = controller.cancelSearch();
            assertThat("Controller is not requesting the correct form", 
                    nextPage, containsString(target));
        }

        @Test
        public void executeSearchWithNullTransaction() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId(null);

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(true));
                never(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                never(searchService).getAuthorizationFor(searchCriteria.geteWiseTransactionId());
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void executeSearchWithEmptyTransaction() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId("");

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(true));
                never(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                never(searchService).getAuthorizationFor(searchCriteria.geteWiseTransactionId());
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void executeSearchWithTransactionNotFound() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;
            final String badTransactionId = "badboy"; 
            final PaymentDetail transactionNotFound = null;

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId(badTransactionId);

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(false));
                atLeast(1).of(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                oneOf(searchService).getAuthorizationFor(with(any(String.class)));
                    will(returnValue(transactionNotFound));
                oneOf(result).addError(with(any(ObjectError.class)));
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void executeSearchWithTransactionFound() {

            final String target = PaymentDetailController.PAYMENT_DETAIL_PAGE;
            final String goodTransactionId = "100000010";
            final PaymentDetail transactionFound = context.mock(PaymentDetail.class);

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId(goodTransactionId);

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(false));
                atLeast(1).of(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                oneOf(searchService).getAuthorizationFor(with(any(String.class)));
                    will(returnValue(transactionFound));
                oneOf(notifications).redirectTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    nextPage, containsString(target));
        }

    }

Mam nadzieję, że to pomoże.

Steve Gelman
źródło
3

Zaktualizowano luty 2018: OpenBrace Limited został zamknięty , a jego produkt ObMimic nie jest już obsługiwany.

Oto kolejna alternatywa, używając biblioteki OpenBrace ObMimic test-doubles Servlet API (ujawnienie: jestem jej programistą).

package com.openbrace.experiments.examplecode.stackoverflow5434419;

import static org.junit.Assert.*;
import com.openbrace.experiments.examplecode.stackoverflow5434419.YourServlet;
import com.openbrace.obmimic.mimic.servlet.ServletConfigMimic;
import com.openbrace.obmimic.mimic.servlet.http.HttpServletRequestMimic;
import com.openbrace.obmimic.mimic.servlet.http.HttpServletResponseMimic;
import com.openbrace.obmimic.substate.servlet.RequestParameters;
import org.junit.Before;
import org.junit.Test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Example tests for {@link YourServlet#doPost(HttpServletRequest,
 * HttpServletResponse)}.
 *
 * @author Mike Kaufman, OpenBrace Limited
 */
public class YourServletTest {

    /** The servlet to be tested by this instance's test. */
    private YourServlet servlet;

    /** The "mimic" request to be used in this instance's test. */
    private HttpServletRequestMimic request;

    /** The "mimic" response to be used in this instance's test. */
    private HttpServletResponseMimic response;

    /**
     * Create an initialized servlet and a request and response for this
     * instance's test.
     *
     * @throws ServletException if the servlet's init method throws such an
     *     exception.
     */
    @Before
    public void setUp() throws ServletException {
        /*
         * Note that for the simple servlet and tests involved:
         * - We don't need anything particular in the servlet's ServletConfig.
         * - The ServletContext isn't relevant, so ObMimic can be left to use
         *   its default ServletContext for everything.
         */
        servlet = new YourServlet();
        servlet.init(new ServletConfigMimic());
        request = new HttpServletRequestMimic();
        response = new HttpServletResponseMimic();
    }

    /**
     * Test the doPost method with example argument values.
     *
     * @throws ServletException if the servlet throws such an exception.
     * @throws IOException if the servlet throws such an exception.
     */
    @Test
    public void testYourServletDoPostWithExampleArguments()
            throws ServletException, IOException {

        // Configure the request. In this case, all we need are the three
        // request parameters.
        RequestParameters parameters
            = request.getMimicState().getRequestParameters();
        parameters.set("username", "mike");
        parameters.set("password", "xyz#zyx");
        parameters.set("name", "Mike");

        // Run the "doPost".
        servlet.doPost(request, response);

        // Check the response's Content-Type, Cache-Control header and
        // body content.
        assertEquals("text/html; charset=ISO-8859-1",
            response.getMimicState().getContentType());
        assertArrayEquals(new String[] { "no-cache" },
            response.getMimicState().getHeaders().getValues("Cache-Control"));
        assertEquals("...expected result from dataManager.register...",
            response.getMimicState().getBodyContentAsString());

    }

}

Uwagi:

  • Każdy „mimic” ma obiekt „mimicState” określający stan logiczny. Zapewnia to wyraźne rozróżnienie między metodami Servlet API a konfiguracją i kontrolą stanu wewnętrznego mimika.

  • Możesz być zaskoczony, że sprawdzenie Content-Type zawiera „charset = ISO-8859-1”. Jednak dla podanego kodu "doPost" jest to zgodne z Javadoc Servlet API, własną metodą getContentType HttpServletResponse oraz aktualnym nagłówkiem Content-Type utworzonym np. Na Glassfish 3. Możesz nie zdawać sobie z tego sprawy, jeśli używasz normalnych pozorowanych obiektów i własne oczekiwania co do zachowania API. W tym przypadku prawdopodobnie nie ma to znaczenia, ale w bardziej złożonych przypadkach jest to rodzaj nieoczekiwanego zachowania API, które może trochę kpić z kpiny!

  • Użyłem response.getMimicState().getContentType()najprostszego sposobu sprawdzenia Content-Type i zilustrowania powyższego punktu, ale rzeczywiście możesz samodzielnie sprawdzić "text / html", jeśli chcesz (używając response.getMimicState().getContentTypeMimeType()). Sprawdzanie nagłówka Content-Type w taki sam sposób, jak w przypadku nagłówka Cache-Control również działa.

  • W tym przykładzie zawartość odpowiedzi jest sprawdzana jako dane znakowe (z użyciem kodowania Writer). Moglibyśmy również sprawdzić, czy użyty został Writer odpowiedzi, a nie jego OutputStream (przy użyciu response.getMimicState().isWritingCharacterContent()), ale uznałem, że interesuje nas tylko wynikowy wynik i nie obchodzi mnie, jakie wywołania API go wyprodukowały (chociaż tak może być sprawdzone też ...). Możliwe jest również pobranie treści odpowiedzi w postaci bajtów, zbadanie szczegółowego stanu elementu Writer / OutputStream itp.

Pełne informacje na temat ObMimic są dostępne do bezpłatnego pobrania na stronie internetowej OpenBrace . Możesz też skontaktować się ze mną, jeśli masz jakieś pytania (dane kontaktowe znajdują się na stronie internetowej).

Mike Kaufman
źródło
2

EDYCJA : Cactus jest teraz martwym projektem: http://attic.apache.org/projects/jakarta-cactus.html


Możesz spojrzeć na kaktusa.

http://jakarta.apache.org/cactus/

Opis Projektu

Cactus to prosta struktura testowa do testowania jednostkowego kodu Java po stronie serwera (serwlety, EJB, tagi, filtry, ...).

Celem Cactus jest obniżenie kosztów pisania testów dla kodu po stronie serwera. Używa JUnit i rozszerza go.

Cactus implementuje strategię w kontenerze, co oznacza, że ​​testy są wykonywane wewnątrz kontenera.

Chris Persichetti
źródło
2

Innym podejściem byłoby utworzenie wbudowanego serwera do "hostowania" twojego serwletu, umożliwiającego pisanie wywołań przeciwko niemu za pomocą bibliotek przeznaczonych do wykonywania wywołań do rzeczywistych serwerów (użyteczność tego podejścia zależy w pewnym stopniu od tego, jak łatwo można uczynić "legalnym" programowym wywołania do serwera - testowałem punkt dostępowy JMS (Java Messaging Service), którego klientów nie brakuje).

Istnieje kilka różnych tras, którymi możesz iść - zwykle dwie to kocur i molo.

Ostrzeżenie: przy wyborze serwera do osadzenia należy pamiętać o używanej wersji apletu servlet-api (biblioteka udostępniająca klasy takie jak HttpServletRequest). Jeśli używasz 2.5, stwierdziłem, że Jetty 6.x działa dobrze (co jest przykładem, który podam poniżej). Jeśli używasz servlet-api 3.0, osadzone elementy tomcat-7 wydają się być dobrą opcją, jednak musiałem zrezygnować z próby jego użycia, ponieważ aplikacja, którą testowałem, używała servlet-api 2.5. Próba połączenia tych dwóch spowoduje NoSuchMethod i inne takie wyjątki podczas próby skonfigurowania lub uruchomienia serwera.

Możesz skonfigurować taki serwer w ten sposób (Jetty 6.1.26, servlet-api 2.5):

public void startServer(int port, Servlet yourServletInstance){
    Server server = new Server(port);
    Context root = new Context(server, "/", Context.SESSIONS);

    root.addServlet(new ServletHolder(yourServletInstance), "/servlet/context/path");

    //If you need the servlet context for anything, such as spring wiring, you coudl get it like this
    //ServletContext servletContext = root.getServletContext();

    server.start();
}
romeara
źródło
Ponadto, jeśli wybierzesz badanie iniekcji zależności, prawdopodobnie napotkasz Spring. Spring używa kontekstów do wyszukiwania wstrzykniętych elementów. Jeśli twój serwlet kończy się na spring, możesz nadać mu ten sam kontekst co test, dodając następujący kod do powyższej metody (przed wywołaniem startowym): XmlWebApplicationContext wctx = new XmlWebApplicationContext (); wctx.setParent (yourAppContext); wctx.setConfigLocation (""); wctx.setServletContext (servletContext); wctx.refresh (); servletContext.setAttribute (WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wctx);
romeara
1

Użyj Selenium do testów jednostkowych opartych na sieci Web. Istnieje wtyczka do Firefoksa o nazwie Selenium IDE, która może rejestrować działania na stronie internetowej i eksportować do przypadków testowych JUnit, które używają Selenium RC do uruchomienia serwera testowego.

BalusC
źródło
Dzięki za to wygląda dobrze, ale tak naprawdę nie testuje metod / kodu serwletu, prawda, nie bezpośrednio? czy się mylę.
Księżycowy,
Robi to poprzez programowe uruchamianie żądań HTTP.
BalusC
1
 public class WishServletTest {
 WishServlet wishServlet;
 HttpServletRequest mockhttpServletRequest;
 HttpServletResponse mockhttpServletResponse;

@Before
public void setUp(){
    wishServlet=new WishServlet();
    mockhttpServletRequest=createNiceMock(HttpServletRequest.class);
    mockhttpServletResponse=createNiceMock(HttpServletResponse.class);
}

@Test
public void testService()throws Exception{
    File file= new File("Sample.txt");
    File.createTempFile("ashok","txt");
    expect(mockhttpServletRequest.getParameter("username")).andReturn("ashok");
    expect(mockhttpServletResponse.getWriter()).andReturn(new PrintWriter(file));
    replay(mockhttpServletRequest);
    replay(mockhttpServletResponse);
    wishServlet.doGet(mockhttpServletRequest, mockhttpServletResponse);
    FileReader fileReader=new FileReader(file);
    int count = 0;
    String str = "";
    while ( (count=fileReader.read())!=-1){
        str=str+(char)count;
    }

    Assert.assertTrue(str.trim().equals("Helloashok"));
    verify(mockhttpServletRequest);
    verify(mockhttpServletResponse);

}

}
ashok
źródło
0

Najpierw prawdopodobnie powinieneś to trochę zmienić, aby DataManager nie był tworzony w kodzie doPost .. powinieneś spróbować Dependency Injection, aby uzyskać instancję. (Zobacz wideo Guice, aby zobaczyć ładne wprowadzenie do DI.). Jeśli każą ci rozpocząć testy jednostkowe, to DI jest koniecznością.

Po wstrzyknięciu zależności możesz przetestować swoją klasę w izolacji.

Aby faktycznie przetestować serwlet, istnieją inne starsze wątki, które to omawiały. Spróbuj tutaj i tutaj .

Roy Truelove
źródło
Ok, dziękuję za komentarze, czy twierdzisz, że DataManager powinien zostać utworzony w ramach metody wewnątrz tego serwletu? obejrzałem ten film i naprawdę go nie rozumiałem :( bardzo nowy w Javie i nigdy nie przeprowadziłem żadnych testów.
Lunar
Spójrz na to wideo Guice (przynajmniej na początku) - dobrze wyjaśnia, dlaczego nigdy nie chcesz tworzyć wystąpienia nowego obiektu w klasie, w której planujesz testy jednostkowe.
Roy Truelove,