6

我的项目中有很多 java bean。我需要为他们生成一个 JUnit 测试类。使用 Eclipse 3.2 和 junit 4.4 生成的测试方法如下所示:

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

我的一些豆子有100多个领域......

有没有一种方法可以让我为 getter 和 setter 提供一个单一的测试方法,例如 testEmployeeid()testName()这样在这些方法中我可以同时测试我的 setter 和 getter,而不是使用 2 diff。他们的测试方法...

我应该如何配置 eclipse 来做到这一点?

4

5 回答 5

24

测试驱动开发的理念是“测试所有可能破坏的东西”。也就是说,将精力集中在有用的测试上,而不是仅仅为了它而编写测试。

Getter 和 setter 几乎都是琐碎的代码,不值得自己测试。

我知道这不是对您请求的直接回答,但我认为指出这一点可能仍然有帮助;-) 那么为什么您实际上需要首先为所有这些 getter 和 setter 编写测试?

于 2010-02-07T20:23:22.297 回答
11

如果您在一个类中有 100 个字段(具有相应的 setter/getter),我怀疑您的对象模型没有正确分解。100 多个字段听起来像是一个对象的异常数量的字段,我猜它有几个职责可以拆分为多个更专业的对象。

于 2010-02-07T20:34:13.270 回答
5

您也许可以使用 Apache Commons 'beanutils' 来帮助自动执行此操作:

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

例如,有一个方法describe(Object bean)将返回所有可读属性(即getter)的映射。

然后迭代该映射并调用:

setSimpleProperty(Object bean, String name, Object value)

public static Object getSimpleProperty(Object bean, String name)

尽管我同意其他海报,但 getter/setter 相当微不足道——我认为仍然值得测试它们——以消除拼写错误、测试属性更改侦听器等。

例如,这将动态提取 bean 的 getter:

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

您需要将 BeanUtils 和 CommonsLogging 以及这两个库的 JAR 下载到您的项目中才能运行此代码。

于 2010-02-07T20:28:49.667 回答
3

我想这个库是你问题的答案:http: //outsidemybox.github.com/testUtils/

它测试所有 bean 的初始值、setter、getter、hashCode()、equals() 和 toString()。您所要做的就是定义默认和非默认属性/值的映射。

它还可以测试带有其他非默认构造函数的 bean 对象。

于 2011-03-04T21:07:35.077 回答
0

在 2021 年回答这个问题,因为这个问题仍然存在。

如果您的 DevOps 管道对 repos 施加覆盖限制,Bean 会添加到代码库中,并且会产生非常负面的影响。有两种方法可以克服它。

  1. 排除豆类(我会说不应该这样做)。

  2. 为 bean 编写测试用例(这是我们作为开发人员可以做的最可悲的事情来浪费我们的时间:()。

在大多数情况下,您最终会为 bean 编写测试用例。

我编写了这个使用反射的简单实用程序/测试用例,可以让您增加 Junit 代码覆盖率并节省您的时间。

待测豆:城市

package com.test.beans;

import java.util.List;

/**
 * @author ameena
 *
 */
public class City {
    private int postOffices;
    private int jurdictaionAreas;
    private double areaInSqMeter;
    private long population;
    private List<City> neighbourCities;
    private boolean metro;

    public int getJurdictaionAreas() {
        return jurdictaionAreas;
    }

    public void setJurdictaionAreas(int jurdictaionAreas) {
        this.jurdictaionAreas = jurdictaionAreas;
    }

    public double getAreaInSqMeter() {
        return areaInSqMeter;
    }

    public void setAreaInSqMeter(double areaInSqMeter) {
        this.areaInSqMeter = areaInSqMeter;
    }

    public long getPopulation() {
        return population;
    }

    public void setPopulation(long population) {
        this.population = population;
    }

    public int getPostOffices() {
        return postOffices;
    }

    public void setPostOffices(int postOffices) {
        this.postOffices = postOffices;
    }

    public List<City> getNeighbourCities() {
        return neighbourCities;
    }

    public void setNeighbourCities(List<City> neighbourCities) {
        this.neighbourCities = neighbourCities;
    }

    public boolean isMetro() {
        return metro;
    }

    public void setMetro(boolean metro) {
        this.metro = metro;
    }
}

自动化 bean 测试的类


package com.test.beans;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;

/**
 * @author ameena
 *
 */
class BeanTest {

    public void invokeSetter(Object obj, String propertyName, Object variableValue)
    {
        PropertyDescriptor propDescriptor;
        try {
            propDescriptor = new PropertyDescriptor(propertyName, obj.getClass());
            Method setter = propDescriptor.getWriteMethod();
            try {
                setter.invoke(obj,variableValue);
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                e.printStackTrace();
                fail(e.getMessage());
            }
        } catch (IntrospectionException e) {
            e.printStackTrace();
            fail(e.getMessage());
        }

    }

    public Object invokeGetter(Object obj, String variableName)
    {
        Object returnValue = null;
        try {
            PropertyDescriptor pd = new PropertyDescriptor(variableName, obj.getClass());
            Method getter = pd.getReadMethod();
            returnValue = getter.invoke(obj);
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | IntrospectionException e) {
            e.printStackTrace();
            fail(e.getMessage());
        }
        return returnValue;
    }


    private <T extends Object> void validateGettersSetters(List<T> objects) {
        for (T t : objects) {
            Class<?> aClass = t.getClass();
            for (java.lang.reflect.Field field : aClass.getDeclaredFields()) {
                System.out.println(field);
                Class<?> c = field.getType();
                if (c == String.class) {
                    invokeSetter(t, field.getName(), "dummy");
                    assertEquals("dummy", (invokeGetter(t, field.getName())));
                } else if (c == Integer.class || c == int.class) {
                    invokeSetter(t, field.getName(), 1);
                    assertEquals(1, (invokeGetter(t, field.getName())));
                }else if (c == Double.class || c == double.class) {
                    invokeSetter(t, field.getName(), 1d);
                    assertEquals(1d, (invokeGetter(t, field.getName())));
                }else if (c == Long.class || c == long.class) {
                    invokeSetter(t, field.getName(), 1l);
                    assertEquals(1l, (invokeGetter(t, field.getName())));
                }else if (c == Boolean.class || c == boolean.class) {
                    invokeSetter(t, field.getName(), true);
                    assertEquals(true, (invokeGetter(t, field.getName())));
                }else if (c == List.class){
                    //Now based on your bean and filed name
                    switch(field.getName()) {
                    case "neighbourCities" :
                        invokeSetter(t, field.getName(), new ArrayList<City>());
                        assertNotNull(invokeGetter(t, field.getName()));
                        break;
                }
            }
        }
    }
    }

    @Test
    void testBean() {
        List<Object> objects = new ArrayList<>();
        objects.add(new City());
        validateGettersSetters(objects);

    }

}

没什么特别的,但它为我节省了为 23 个 bean 编写测试用例 :)

问候阿米特·米娜

于 2021-09-30T11:13:20.663 回答