吸气剂和固化剂的junit试验方法

Gir*_*att 6 java junit unit-testing getter-setter

我的项目中有很多java bean.我需要为它们生成一个JUnit Test类.使用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");
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pét*_*rök 23

测试驱动开发的理念是"测试可能破坏的一切".也就是说,将精力集中在有用的测试上,而不是为了它而编写测试.

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

我知道这不是你的请求的直接答案,但我认为它可能仍然有助于指出这一点;-)那么为什么你真的需要首先为所有那些吸气剂和制定者编写测试?

  • 我强烈反对.您为了*regression*目的测试setter和getter,这样当你的setter/getter变得更复杂时,测试确认它们仍像以前一样运行. (16认同)
  • 是的,会很好.Java有时候太冗长了.C#让这个更好. (2认同)
  • @Brian:IMO完全涵盖了上述格言.如果在可预见的将来我的getter/setter实现可能变得更加复杂,那么我当然会编写我的小测试.但是,我会说你的"什么时候"对我来说仍然看起来像一个相当大的"如果";-) (2认同)
  • 测试getter和setter会降低你的代码覆盖率,并且getter和setter应该被其他地方测试的某些行为使用(从而给予它们覆盖),或者它们应该被删除,因为它们没有作为某些行为的一部分进行测试(因此,应该不得在生产代码中使用).贬值来自于无法找到任何行为未使用的代码,包括未使用的getter和setter. (2认同)

Bri*_*new 11

如果一个类中有100个字段(带有相应的setter/getters),我怀疑你的对象模型没有正确分解.100多个字段听起来像一个对象的非常多的字段,我猜它有几个职责可以分成许多更专业的对象.


mon*_*nny 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)
Run Code Online (Sandbox Code Playgroud)

public static Object getSimpleProperty(Object bean, String name)
Run Code Online (Sandbox Code Playgroud)

虽然我同意其他海报而不是吸气剂/安装者是非常微不足道的 - 我认为它仍然值得测试 - 消除错别字,测试属性改变听众等.

例如,这将动态提取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;
    }}
Run Code Online (Sandbox Code Playgroud)

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