Cara menguji servlet saya menggunakan JUnit

112

Saya telah membuat sistem web menggunakan Java Servlets dan sekarang ingin melakukan pengujian JUnit. Saya dataManagerhanyalah sepotong kode dasar yang mengirimkannya ke database. Bagaimana Anda menguji Servlet dengan JUnit?

Contoh kode saya yang memungkinkan pengguna untuk mendaftar / mendaftar, yang dikirimkan dari halaman utama saya melalui 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);
    }  
}
Lunar
sumber

Jawaban:

169

Anda dapat melakukan ini menggunakan Mockito agar tiruan mengembalikan param yang benar, memverifikasi mereka memang dipanggil (secara opsional tentukan berapa kali), tulis 'hasil' dan verifikasi itu benar.

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
sumber
Dengan cara ini, bagaimana Anda memastikan "Cache-Control" disetel pada respons?
Markus Schulte
34
Alih-alih mencetak ke file aktual pada disk, Anda dapat menggunakan StringWriter (sebagai parameter untuk konstruktor PrintWriter). Anda kemudian akan assertTrue (stringWriter.toString (). Contains ("My Expected String")); Dengan cara ini, pengujian akan membaca / menulis memori, bukan disk.
spg
@aaronvargas: Terima kasih atas jawaban Anda! Tetapi ketika saya menjalankan kode Anda, maka saya mendapatkan kesalahan berikut: java.util.MissingResourceException: Tidak dapat menemukan bundel untuk nama dasar javax.servlet.LocalStrings, locale de_DE - Ini terjadi selama eksekusi MyServlet baru (). DoPost ( ...). Tahu apa yang bisa dipatahkan?
Benny Neugebauer
1
@BennyNeugebauer, sepertinya bundel tidak ada di classpath. Saya akan menulis pengujian JUnit lain yang Hanya mendapat nilai dari Bundle untuk mengisolasi masalahnya.
aaronvargas
@aaronvargas, terima kasih atas tanggapan Anda! Saya menemukan solusi untuk itu. Saya harus "javax.servlet-api" ke dependensi saya di pom.xml saya.
Benny Neugebauer
49

Pertama, dalam aplikasi nyata, Anda tidak akan pernah mendapatkan info koneksi database dalam servlet; Anda akan mengonfigurasinya di server aplikasi Anda.

Namun, ada cara untuk menguji Servlet tanpa menjalankan penampung. Salah satunya adalah dengan menggunakan objek tiruan. Spring menyediakan serangkaian tiruan yang sangat berguna untuk hal-hal seperti HttpServletRequest, HttpServletResponse, HttpServletSession, dll:

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

Dengan menggunakan tiruan ini, Anda dapat menguji hal-hal seperti

Apa yang terjadi jika nama pengguna tidak ada dalam permintaan?

Apa yang terjadi jika nama pengguna ada dalam permintaan?

dll

Anda kemudian dapat melakukan hal-hal seperti:

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
sumber
3

Saya menemukan pengujian Selenium lebih berguna dengan pengujian integrasi atau fungsional (end-to-end). Saya bekerja dengan mencoba menggunakan org.springframework.mock.web , tetapi saya tidak terlalu jauh. Saya memasang pengontrol sampel dengan rangkaian pengujian jMock .

Pertama, Pengendali:

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;
            }
        }
    }

}

Selanjutnya, tesnya:

    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));
        }

    }

Saya harap ini bisa membantu.

Steve Gelman
sumber
3

Diperbarui Feb 2018: OpenBrace Limited telah ditutup , dan produk ObMimic-nya tidak lagi didukung.

Berikut alternatif lain, menggunakan pustaka ObMimic dari Servlet API test-doubles OpenBrace (pengungkapan: Saya pengembangnya).

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());

    }

}

Catatan:

  • Setiap "mimic" memiliki objek "mimicState" untuk status logisnya. Ini memberikan perbedaan yang jelas antara metode API Servlet dan konfigurasi serta pemeriksaan status internal mimic.

  • Anda mungkin terkejut bahwa pemeriksaan Jenis Konten menyertakan "charset = ISO-8859-1". Namun, untuk kode "doPost" yang diberikan, ini sesuai dengan Servlet API Javadoc, dan metode getContentType HttpServletResponse sendiri, dan header Jenis Konten sebenarnya yang dihasilkan misalnya pada Glassfish 3. Anda mungkin tidak menyadari hal ini jika menggunakan objek tiruan normal dan ekspektasi sendiri dari perilaku API. Dalam hal ini mungkin tidak masalah, tetapi dalam kasus yang lebih kompleks ini adalah jenis perilaku API yang tidak terduga yang dapat membuat sedikit ejekan!

  • Saya telah menggunakan response.getMimicState().getContentType()cara termudah untuk memeriksa Jenis-Konten dan mengilustrasikan poin di atas, tetapi Anda memang dapat memeriksa "teks / html" sendiri jika Anda ingin (menggunakan response.getMimicState().getContentTypeMimeType()). Memeriksa header Content-Type dengan cara yang sama seperti untuk header Cache-Control juga berfungsi.

  • Untuk contoh ini konten respons diperiksa sebagai data karakter (dengan ini menggunakan pengkodean Penulis). Kami juga dapat memeriksa bahwa Writer respons digunakan daripada OutputStream-nya (menggunakan response.getMimicState().isWritingCharacterContent()), tetapi saya menganggap bahwa kami hanya mementingkan output yang dihasilkan, dan tidak peduli panggilan API apa yang menghasilkannya (meskipun itu bisa jadi diperiksa juga ...). Ini juga memungkinkan untuk mengambil konten tubuh respons sebagai byte, memeriksa status detail Writer / OutputStream, dll.

Ada rincian lengkap tentang ObMimic dan unduhan gratis di situs web OpenBrace . Atau Anda dapat menghubungi saya jika Anda memiliki pertanyaan (detail kontak ada di situs web).

Mike Kaufman
sumber
2

EDIT : Cactus sekarang menjadi proyek mati: http://attic.apache.org/projects/jakarta-cactus.html


Anda mungkin ingin melihat kaktus.

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

Deskripsi Proyek

Cactus adalah kerangka kerja pengujian sederhana untuk pengujian unit kode java sisi server (Servlets, EJBs, Tag Libs, Filters, ...).

Maksud dari Cactus adalah untuk menurunkan biaya penulisan tes untuk kode sisi server. Ini menggunakan JUnit dan memperluasnya.

Cactus mengimplementasikan strategi dalam wadah, artinya pengujian dijalankan di dalam wadah.

Chris Persichetti
sumber
2

Pendekatan lain adalah membuat server tertanam untuk "menghosting" servlet Anda, memungkinkan Anda untuk menulis panggilan padanya dengan pustaka yang dimaksudkan untuk membuat panggilan ke server sebenarnya (kegunaan dari pendekatan ini agak tergantung pada seberapa mudah Anda dapat membuat "sah" programatik panggilan ke server - Saya sedang menguji titik akses JMS (Java Messaging Service), yang banyak kliennya).

Ada beberapa rute berbeda yang dapat Anda lalui - dua yang biasa adalah tomcat dan jetty.

Peringatan: sesuatu yang harus diperhatikan saat memilih server untuk disematkan adalah versi servlet-api yang Anda gunakan (pustaka yang menyediakan kelas seperti HttpServletRequest). Jika Anda menggunakan 2.5, saya menemukan Jetty 6.x berfungsi dengan baik (contoh yang akan saya berikan di bawah). Jika Anda menggunakan servlet-api 3.0, tomcat-7 yang disematkan tampaknya merupakan pilihan yang baik, namun saya harus mengabaikan upaya saya untuk menggunakannya, karena aplikasi yang saya uji menggunakan servlet-api 2.5. Mencoba mencampur keduanya akan menghasilkan NoSuchMethod dan pengecualian serupa lainnya saat mencoba mengonfigurasi atau memulai server.

Anda dapat mengatur server seperti ini (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
sumber
Juga, jika Anda memilih untuk menyelidiki injeksi ketergantungan, Anda mungkin akan mengalami Spring. Spring menggunakan konteks untuk mencari item yang diinjeksi. Jika servlet Anda akhirnya menggunakan spring, Anda bisa menyediakannya dengan konteks yang sama seperti pengujian dengan menambahkan berikut ini ke metode di atas (sebelum panggilan mulai): 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

Gunakan Selenium untuk pengujian unit berbasis web. Ada plugin Firefox bernama Selenium IDE yang dapat merekam tindakan di halaman web dan mengekspor ke kasus pengujian JUnit yang menggunakan Selenium RC untuk menjalankan server pengujian.

BalusC
sumber
Terima kasih untuk ini terlihat bagus, tetapi tidak benar-benar menguji metode / kode servlet bukan, bukan secara langsung? atau apakah saya salah.
Lunar
Memang, dengan mengaktifkan permintaan HTTP secara terprogram.
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
sumber
0

Pertama, Anda mungkin harus merefaktor ini sedikit sehingga DataManager tidak dibuat dalam kode doPost .. Anda harus mencoba Injeksi Ketergantungan untuk mendapatkan sebuah instance. (Lihat video Guice untuk pengantar yang bagus tentang DI.). Jika Anda diberi tahu untuk memulai pengujian unit semuanya, maka DI harus dimiliki.

Setelah dependensi Anda dimasukkan, Anda dapat menguji kelas Anda secara terpisah.

Untuk benar-benar menguji servlet, ada utas lama lainnya yang telah membahas ini .. coba di sini dan di sini .

Roy Truelove
sumber
Ok terima kasih atas komentar Anda, apakah Anda mengatakan bahwa DataManager harus dibuat dalam metode di dalam servlet itu? saya menonton video itu dan tidak benar-benar memahaminya :( sangat baru di java, dan belum pernah melakukan pengujian apa pun.
Lunar
Lihat video Guice itu (setidaknya di awal) - itu berfungsi dengan baik dalam menjelaskan mengapa Anda tidak pernah ingin membuat instance objek baru di kelas yang Anda rencanakan pada pengujian unit.
Roy Truelove