com.programmingchronicles.tdd.web.addressbook.TestShowContactsController.java Source code

Java tutorial

Introduction

Here is the source code for com.programmingchronicles.tdd.web.addressbook.TestShowContactsController.java

Source

/*
 * Copyright (C) 2010-2011, Pedro Ballesteros <pedro@theprogrammingchronicles.com>
 *
 * This file is part of The Programming Chronicles Test-Driven Development
 * Exercises(http://theprogrammingchronicles.com/)
 *
 * This copyrighted material is free software: you can redistribute it
 * and/or modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This material is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this material. This copy is available in LICENSE-GPL.txt
 * file. If not, see <http://www.gnu.org/licenses/>.
 */

package com.programmingchronicles.tdd.web.addressbook;

import com.programmingchronicles.tdd.web.addressbook.ShowContactsController;
import com.programmingchronicles.tdd.addressbook.GlobalAddressBook;
import com.programmingchronicles.tdd.domain.Contact;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletException;
import org.junit.*;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

/**
 * Tests del controlador de obtencin de contactos.
 *
 * <p>
 * Esta implementacion usa los Fakes proporcionados por la librera
 * de utilidades de testing de Spring, que proporciona una implementacin
 * completa de los objetos del contenedor de Servlets.</p>
 *
 * <p>
 * Es decir, tenemos ya codificados los Fakes que se han creado en
 * el ejercicio 5.7. </p>
 *
 * <p>
 * <b>DISEO:</b> Arquitectura MVC usando tan slo tecnologas del J2EE:<br/>
 *     <li>- Modelo: JavaBeans (Java-Old Plain Objects).
 *     <li>- Controlador: Un Servlet para cada peticin web.
 *     <li>- Vista: JSP (sin nada de lgica, solo JSTL + EL).
 * </p>
 *
 * @author Pedro Ballesteros <pedro@theprogrammingchronicles.com>
 */
public class TestShowContactsController {

    // Mocks
    private GlobalAddressBook mockAddressbook;
    private List<Contact> contactList;

    // Object Under Test
    private ShowContactsController controller;

    @Before
    public void setUp() {
        controller = new ShowContactsController();

        // Fixtures: Contactos de ejemplo.
        Contact c1 = new Contact();
        c1.setId("Id1");
        Contact c2 = new Contact();
        c2.setId("Id2");

        // Lista lista de contactos de ejemplo que devuelve la agenda.
        contactList = Arrays.asList(c1, c2);

        // Mock de GlobalAddressBook que devuelve los contactos de ejemplo.
        mockAddressbook = mock(GlobalAddressBook.class);
        when(mockAddressbook.getAll()).thenReturn(contactList);

        // Se configura por Direct Injection el addressbook usado
        // por el controlador.
        controller.setAddressBook(mockAddressbook);

        // La vista ahora es configurable
        controller.setViewPath("viewPath");
    }

    /**
     * Test del mtodo doGet, que procesa la peticin.
     *
     * <p>
     * Al ser una arquitectura MVC, lo unico que hay que testear es:<br/>
     * <ol>
     *    <li> El controlador recibe los parametros.
     *    <li> Construye el modelo de forma adecuada.
     *    <li> Se redirige la peticin a la vista adecuada.
     * </ol>
     * </p>
     * <p>
     * El controlador se implementar como un Servlet, y la logica se
     * procesar en un HTTP GET.</p>
     */
    @Test
    public void testDoGet() throws ServletException, IOException {

        // Fakes de los parametros del doGet y doPost que amplian la interfaz
        // estandar permitiendo verificaciones sencillas por estado.
        //
        // Se utilizan los mocks de Spring Test Utilities.
        MockHttpServletRequest fakeRequest = new MockHttpServletRequest();
        MockHttpServletResponse fakeResponse = new MockHttpServletResponse();

        // Ejecucin del test.
        controller.doGet(fakeRequest, fakeResponse);

        // Diseo de nuestra arquitectura MVC:
        //   El servlet (controlador) construye el modelo y lo hace
        //   accesible a la vista, que ser una JSP.
        //
        //   El modelo se crea como atributos del request (request.setAttribute).
        //
        //   En este caso aprobechamos los domain objects del sistema. Otros
        //   controladores podran definir modelos propios. Las necesidades
        //   particulares de la logica de presentacin no deben influir en la
        //   lgica de negocio. El modelo es lgica de presentacin, no de
        //   negocio.

        // El request y response son los parametros de entrada y salida
        // del mtodo testado, con los fakes ahora podemos hacer verificacin
        // por estado en lugar de interaccin.

        // Verifica que el modelo se a creado correctamente. Ahora se puede
        // verificar por estado, porque sabemos que nuestro fake devuelve
        // valores reales establecidos con el setAttribute.
        assertSame(fakeRequest.getAttribute("contacts"), contactList);

        // Verifica que el forward se realiza a la vista correcta, usando
        // las facilidades del Fake que permiten obtener el path del forward,
        // en lugar de realizar una validacin por interaccin.
        assertEquals("viewPath", fakeResponse.getForwardedUrl());
    }
}