Java 使用eclipse模板创建测试用例

Java 使用eclipse模板创建测试用例,java,eclipse,junit,Java,Eclipse,Junit,我经常发现自己为getter\setter、c'tor和Object方法(hashCode、equals和toString)创建了相同的单元测试方法。 在EclipseIDE的帮助下,我试图实现这个过程的自动化。 考虑这个例子: public Class Person { private String id; private String name; public Person(String id, String name){ this.id = id; this.

我经常发现自己为getter\setter、c'tor和Object方法(hashCode、equals和toString)创建了相同的单元测试方法。 在EclipseIDE的帮助下,我试图实现这个过程的自动化。 考虑这个例子:

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实现自动化吗?

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

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

有时Java使用非面向对象类来促进信息传输。该类保证在执行序列化时将所有信息作为一个单元传输。因此,拥有这样一个类并不意味着代码是错误的;然而,如果你遇到了太多这样的类,那么有些事情是非常错误的

测试的一个关键要素是,如果测试不能失败,那么它就不是真正的测试。如果测试不能失败,那就是忙活。假设其中一个字段不能为null,则setter可能如下所示

public void setName(String name) {
  if (name == null) throw new IllegalArgumentException("name cannot be null");
  this.name = name;
}
然后你有一些东西要测试。否则,您只需检查赋值运算符是否失败。另一方面,如果赋值操作符失败,那么我敢打赌JVM会很快(而不是很晚)崩溃,而且您也不能相信您的测试会正确报告。

看一看。这是一个eclipse插件,它提供了非常好的模板化特性,这正是您想要的。在文档页面上,查找创建单元测试部分


这个插件的一个非常有用的特性是自动创建单元测试。单元测试可以是JUnit3、JUnit4或TestNG类型。对于JUnit4或TestNG测试,将自动添加适当的注释。只需配置一次

Edwin,我不是想测试java。在我开始使用它之前,它很好用。。。getter通常是无逻辑的,我可以理解为什么不需要检查它们(除了增加覆盖率)。然而,对象方法肯定会出错。特别是equals和hashCode。c'tor也是如此。有了一个单元测试框架,并准备好了方法存根,指向测试方法的javadoc是一个非常节省时间的方法。我希望得到一个到现有代码模板的链接,因为我怀疑这个问题会让其他人产生bug。Assaf说测试等于是正确的,hashCode很重要。这些实现需要确保它们协同工作,并且它们支持各自的契约。实际上,您正在测试setter方法的编码是否正确。很多时候,通过使用IDE代码生成快捷方式或copy-n-paste,即使是这些简单的方法也会被错误地编码