我经常发现自己为getter \ setters,c'tors和Object方法(hashCode,equals和toString)创建相同的单元测试方法。 在Eclipse IDE的帮助下,我想要实现的是这个过程的自动化。 考虑这个例子:
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自动化吗?
答案 0 :(得分:11)
看看Fast Code。它是一个eclipse插件,提供了非常好的模板化功能,这是你似乎在寻找的东西。在文档页面上查找“创建单元测试”部分。
此插件的一个非常有用的功能是自动创建单元测试。单元测试可以是Junit 3,Junit 4或TestNG。对于Junit 4或TestNG测试,将自动添加适当的注释。一个人只需要配置一次。
答案 1 :(得分:3)
单元测试旨在表明Object的行为符合其预期的行为。它们并不是要确保Java语言正常工作。
这里有一个奇特的数据结构,没有任何行为。在这种情况下,每个赋值都由方法调用调解,每个解引用也由方法调用调解。由于面向对象编程是“数据+行为”=对象,并且此代码缺乏行为,因此它被称为非面向对象的代码。
有时,Java使用非面向对象的类来促进信息传输。该类保证在进行序列化时所有信息都作为一个单元传输。所以拥有这样一个类并不是代码错误的指标;但是,如果你遇到太多像这样的课程,那么就会出现问题。
测试的一个关键要素是,如果测试不能失败,那么它并不是真正的测试。如果测试不能失败,那就是繁忙的工作。假设其中一个字段不能为null,那么setter可能看起来像
public void setName(String name) {
if (name == null) throw new IllegalArgumentException("name cannot be null");
this.name = name;
}
然后你要测试一下。否则,您只需检查分配操作符是否失败。顺便说一句,如果赋值运算符失败了,那么我敢打赌JVM会很快(而不是稍后)发生故障,你也不能相信你的测试能够正确报告。