2010-02-07 34 views
6

Tengo muchos beans Java en mi proyecto. Necesito generar una clase JUnit Test para ellos. Los métodos de prueba generados usando Eclipse 3.2 & JUnit 4.4 aspecto como el siguiente:método de prueba junit para getters & setters

public void testGetName() { 
     // fail("Not yet implemented"); 
    } 

    @Test 
    public void testSetName() { 
     // fail("Not yet implemented"); 
    } 

    @Test 
    public void testGetEmployeeid() { 
     // fail("Not yet implemented"); 
    } 

    @Test 
    public void testSetEmployeeid() { 
     // fail("Not yet implemented"); 
    } 

algunos de mis frijoles tienen más de 100 campos ...

¿Hay un camino por el cual puedo obtener una sola prueba método para ambos getters & setters como testEmployeeid(), testName() para que en estos métodos pueda probar mis setters & getters en lugar de usar 2 diff. métodos de prueba para ellos ...

¿Cómo debo configurar eclipse para hacer esto?

+0

¿Qué complemento de eclipse está utilizando para generar los métodos de prueba? – Yoni

+0

FWIW, la siguiente pregunta trata de dejar de lado el debate y preguntar si hay una manera de hacerlo automáticamente según su preferencia: http://stackoverflow.com/questions/108692 –

+5

El problema ** real ** aquí no tiene ninguna relación para probar la unidad por completo: "* algunos de mis beans r tienen más de 100 campos *" ... para cualquier novato de Java que lea esta pregunta, comprenda que esta es * terrible * programación. Cualquier clase que tenga más de 100 campos tiene demasiada responsabilidad. Vea [this] (http://stackoverflow.com/questions/4683841/what-is-object-decomposition) si no entiende por qué. – IAmYourFaja

Respuesta

25

La filosofía de Test Driven Development dice "prueba todo lo que pueda romperse". Es decir, enfoca tus esfuerzos en las pruebas útiles, en lugar de escribir pruebas por el simple hecho de hacerlo.

Los getters y setters son casi siempre un código trivial, que no vale la pena probar por sí mismos.

Sé que esta no es una respuesta directa a su súplica, pero pensé que aún podría ayudar señalar esto ;-) Entonces, ¿por qué realmente necesita escribir pruebas para todos los captadores y establecedores en primer lugar?

+1

+1 Acepto que los métodos de acceso no necesitan pruebas. Me falta una característica que les permita ser declarada por una anotación. – stacker

+13

No estoy de acuerdo. Probas los setters y getters para * regression *, de modo que cuando tus setters/getters cambian para ser más complejos, las pruebas confirman que todavía funcionan como antes. –

+2

Sí, estaría bien. Java es demasiado detallado en ocasiones. C# consiguió este mejor. –

5

tal vez podría utilizar 'BeanUtils' Apache Commons para ayudar a automatizar esto:

http://commons.apache.org/beanutils/apidocs/org/apache/commons/beanutils/PropertyUtils.html#getSimpleProperty%28java.lang.Object,java.lang.String%29

Por ejemplo, hay un método describe(Object bean) que devolverá un mapa de todos los atributos de lectura mecánica (es decir, getter).

A continuación, recorra ese mapa y llamar a:

setSimpleProperty(Object bean, String name, Object value) 

y

public static Object getSimpleProperty(Object bean, String name) 

Y aunque estoy de acuerdo con el otro cartel que getters/setters son bastante trivial - Creo que es todavía vale la pena probarlos - para eliminar errores tipográficos, probar detectores de cambio de propiedad, etc.

Por ejemplo, esto extraerá dinámicamente los captadores de un frijol:

import java.io.Serializable; 
import java.util.Set; 
import org.apache.commons.beanutils.PropertyUtils; 

public class MyTestBean implements Serializable { 
    private int a; 
    private int b; 
    private int c; 
    private String x; 
    private String y; 
    private String z; 

    public static void main(String[] args) throws Exception { 
    MyTestBean bean=new MyTestBean(); 
    Set prop=PropertyUtils.describe(bean).keySet(); 
    for (Object o : prop) { 
     System.out.println((String)o); 
    } 
    } 

    public int getA() { 
     return a; 
    } 
    public void setA(int a) { 
     this.a = a; 
    } 
    public int getB() { 
     return b; 
    } 
    public void setB(int b) { 
     this.b = b; 
    } 
    public int getC() { 
     return c; 
    } 
    public void setC(int c) { 
     this.c = c; 
    } 
    public String getX() { 
     return x; 
    } 
    public void setX(String x) { 
     this.x = x; 
    } 
    public String getY() { 
     return y; 
    } 
    public void setY(String y) { 
     this.y = y; 
    } 
    public String getZ() { 
     return z; 
    } 
    public void setZ(String z) { 
     this.z = z; 
    }} 

Deberá descargar tanto BeanUtils como CommonsLogging y los JAR de ambas bibliotecas en su proyecto para ejecutar este código.

11

Si tiene 100 campos en una clase (con los correspondientes setters/getters) sospecho que su modelo de objeto no está descompuesto correctamente. Más de 100 campos suenan como una cantidad extraordinaria de campos para un objeto, y supongo que tiene varias responsabilidades que se pueden dividir entre una serie de objetos más especializados.

+0

Si bien ese es a menudo el caso, puede no ser necesariamente incorrecto tener tantos campos. Imagine que esta clase existe para proporcionar una asignación de Jaxb a un archivo XML muy grande, por ejemplo. – Steve

3

supongo que esta biblioteca es la respuesta a su pregunta: http://outsidemybox.github.com/testUtils/

pone a prueba todos los valores del frijol iniciales, los emisores, los captadores, hashCode(), es igual a() y toString(). Todo lo que tiene que hacer es definir un mapa de propiedad/valor predeterminado y no predeterminado.

También puede probar los objetos que son granos con constructores adicionales no por defecto.

+0

Solo para referencia futura. Por favor absténgase de copiar y pegar las respuestas y también de promocionarse a sí mismo. Gracias. – Bobby