Cuando usar objetos simulados en pruebas de unidad

JLE:

Soy consciente de que hay muchas preguntas acerca de burlas y las pruebas, pero no se encontró ninguna que me ayudó a la perfección, así que todavía tengo problemas para comprender la siguientes;

Por favor, corríjanme si me dieron este mal, pero por lo que veo, las pruebas unitarias se utilizan para probar la lógica de negocio de una clase particular de forma aislada y si hay objetos necesarios desde el exterior van a ser burlado. Así, por ejemplo si tengo un sistema de gestión para los ciudadanos de una ciudad sencilla que se suma a los ciudadanos a una lista y devuelve el ciudadano por sus nombres (assumtion: ciudadanos consistir en sólo unos pocos datos personales básicos), así:

public class ProcessClass {

    ArrayList<Citizen> citizenList = new ArrayList<Citizen>();

    public void addCitizen(Citizen citizen) {
        citizenList.add(citizen);
    }

    public Citizen getByName(String name) {
        for (Citizen c : citizenList) {
            if (c.getName().equals(name)) {
                return c;
            }
        }
        return null;
    }

}

Si ahora quiero prueba unitaria Mi ProcessClasshacer yo considero Citizencomo una característica externa que tiene que ser objeto de burla, o puedo simplemente crear una Citizencon fines de prueba? Si ellos son objeto de burla, ¿cómo iba a probar el método para obtener el objeto por su nombre, ya que el objeto de burla, no es que contiene los parámetros?

podómetro:

Si ellos son objeto de burla, ¿cómo iba a probar el método para obtener el objeto por su nombre, ya que el objeto de burla, no es que contiene los parámetros?

Puede burlarse de la llamada a getName, usando Mockito por ejemplo:

Citizen citizen = mock(Citizen.class);
when(citizen.getName()).thenReturn("Bob");

He aquí un ejemplo de una prueba para el método

ProcessClass processClass = new ProcessClass();

Citizen citizen1 = mock(Citizen.class);
Citizen citizen2 = mock(Citizen.class);
Citizen citizen3 = mock(Citizen.class);

@Test
public void getByName_shouldReturnCorrectCitizen_whenPresentInList() {
    when(citizen1.getName()).thenReturn("Bob");
    when(citizen2.getName()).thenReturn("Alice");
    when(citizen3.getName()).thenReturn("John");

    processClass.addCitizen(citizen1);
    processClass.addCitizen(citizen2);
    processClass.addCitizen(citizen3);

    Assert.assertEquals(citizen2, processClass.getByName("Alice"));
}

@Test
public void getByName_shouldReturnNull_whenNotPresentInList() {
    when(citizen1.getName()).thenReturn("Bob");

    processClass.addCitizen(citizen1);

    Assert.assertNull(processClass.getByName("Ben"));
}

Nota:

Yo recomendaría burla. Digamos que escribir 100 pruebas en las que se instancia una Citizenclase de esta manera

Citizen c = new Citizen();

y unos meses más tarde, su constructor cambia para quitar un argumento, que es un objeto en sí mismo, la clase City, por ejemplo. Ahora tiene que volver atrás y cambiar todas estas pruebas y escritura:

City city = new City("Paris");
Citizen c = new Citizen(city);

Si burlaste Citizenpara empezar, usted no necesitaría a.

Ahora, ya que es POJO y su constructor del método getName podrían no cambio, no se burla aún debe estar bien.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=183440&siteId=1
Recomendado
Clasificación