2011-03-16 43 views
5

通常我会发现自己为getter \ setter,c'tors和Object方法(hashCode,equals和toString)创建了相同的单元测试方法。 我想在Eclipse IDE的帮助下实现这个过程的自动化。 考虑这个例子:使用eclipse模板创建测试用例

public Class Person { 
    private String id; 
    private String name; 

    public Person(String id, String name){ 
    this.id = id; 
    this.name = name; 
    } 

    public String getId() { return id; } 
    public void setId(String id) { 
    this.id = id; 
    } 

    public String getName() { return name; } 
    public void setName(String name) { 
    this.name = name; 
    } 

    @override 
    public int hashCode(){ ... } 
    public boolean equals(Person other){ ... } 
    public String toString(){ ... } 

    /* this class may implement other logic which is irrelevant for the sake of question */ 
} 

单元测试类会是这个样子:

public class PersonTest extends TestCase 
{ 
    @override 
    public void setup() { 
    Person p1 = new Person("1","Dave"); 
    Person p2 = new Person("2","David"); 
    } 

    @override 
    public void tearDown() { 
    Person p1 = null; 
    Person p2 = null; 
    } 

    public void testGetId() { 
    p1.setId("11"); 
    assertEquals("Incorrect ID: ", "11", p1.getId()); 
    } 

    public void testGetName() { /* same as above */ } 

    public void testEquals_NotEquals() { /* verify that differently initialized instances are not equals */ } 

    public void testEquals_Equals() { /* verify that an object is equals to itself*/ } 

    public void testHashCode_Valid() { /* verify that an object has the same hashcode as a similar object*/ } 

    public void testHashCode_NotValid() { /* verify that different objects has different hashcodes*/ } 

    public void testToString() { /* verify that all properties exist in the output*/ } 
} 

这骨架相似,绝大多数创建的类。 它可以自动化与Eclipse?

回答

11

看看Fast Code。它是一个eclipse插件,它提供了模板材料的非常好的功能,这是你似乎在寻找的东西。在文档页面上查找“创建单元测试”部分。

这个插件的一个非常有用的功能是自动创建单元测试。单元测试可以是Junit 3,Junit 4或TestNG类型。对于Junit 4或TestNG测试,适当的注释将被自动添加。一个需要配置一次。

您还可能发现此Stack Overflow discussion useful

希望有所帮助。

+2

谢谢Nilesh,我会看看 – 2011-03-17 12:32:59

+2

这个插件非常适合创建单元测试。 – javaguy 2011-03-19 20:45:43

1

单元测试旨在显示对象的行为符合其预期行为。它们并不是要确保Java语言正常工作。

你在这里是一个奇特的数据结构,没有任何行为。在这种情况下,每个赋值都是由方法调用调用的,每个解除引用也由方法调用调用。由于面向对象的编程是“数据+行为”=对象,并且此代码缺乏行为,所以它被称为非面向对象的代码。

有时Java使用非面向对象的类来促进信息传输。该类确保所有信息在序列化时作为一个单元传输。所以拥有这样一个类并不代表代码是错误的;然而,如果你遇到这样的类太多,那么有些东西是非常错误的。

测试的一个关键要素是,如果测试不能失败,那么测试并不是真正的测试。如果测试不能失败,那只是忙碌的工作。假设这些字段中的一个不能为空,那么setter可能看起来像

public void setName(String name) { 
    if (name == null) throw new IllegalArgumentException("name cannot be null"); 
    this.name = name; 
} 

然后你有东西要测试。否则,您只需检查赋值运算符是否失败。顺便说一句,如果赋值运算符失败了,那么我敢打赌,JVM会很快(而不是晚些时候)很难下载,并且不能相信测试也能正确报告。

+2

埃德温,我不是故意测试java。在我开始使用它之前它工作得很好...... getters通常是无逻辑的,我可以理解为什么不需要检查它们(除了增加覆盖率)。但是,对象方法必然会出错。尤其是equals和hashCode。 c'tor也一样。有一个单元测试框架,准备了方法存根,javadoc指向测试方法是一个很好的节省时间。我希望能够获得现有代码模板的链接,因为我怀疑这个问题会导致其他问题。 – 2011-03-16 23:18:45

+1

Assaf在说明测试equals和hashCode非常重要时是正确的。这些实施需要确保他们一致地工作,并支持他们各自的合同。 – 2011-03-17 00:58:52

+0

关于'否则,你只是检查看看赋值操作符是否失败'语句。实际上,你正在测试setter方法是否编码正确。很多时候,通过使用IDE代码生成快捷方式或复制粘贴,即使这些简单的方法也会被错误地编码。 – 2011-03-17 01:03:21