Java 我是否需要前缀';测试';我用GWTTestCase创建的每个单元测试方法?

Java 我是否需要前缀';测试';我用GWTTestCase创建的每个单元测试方法?,java,gwt,junit,gwttestcase,Java,Gwt,Junit,Gwttestcase,我正在学习如何在GWT中执行单元测试。因此,我创建了一个扩展GWTTestCase类的类,并在其中编写测试方法 问题是,如果除了继承的“getModuleName”方法之外,我甚至没有在这个类(公共或私有)中的一个函数前面加上“test”这个词,我会得到一个“初始化错误” 现在我是做错了什么,还是添加这个前缀是一个规则?如果这实际上是一条规则,那么原因是什么 public class hellotest extends GWTTestCase{ @Override public String g

我正在学习如何在GWT中执行单元测试。因此,我创建了一个扩展GWTTestCase类的类,并在其中编写测试方法

问题是,如果除了继承的“getModuleName”方法之外,我甚至没有在这个类(公共或私有)中的一个函数前面加上“test”这个词,我会得到一个“初始化错误”

现在我是做错了什么,还是添加这个前缀是一个规则?如果这实际上是一条规则,那么原因是什么

public class hellotest extends GWTTestCase{
@Override
public String getModuleName() {
    // TODO Auto-generated method stub
    return "hellopackage.Hello1";
}

public void test()
{
    assertTrue(true);
}

public void test2()
{
    assertTrue(true);
}

public void notTest3()     //Produces initialization error
{
    assertTrue(true);
}
}
初始化错误的堆栈跟踪:-

// Compiled from Filter.java (version 1.5 : 49.0, super bit)
public abstract class org.junit.runner.manipulation.Filter {

  // Field descriptor #14 Lorg/junit/runner/manipulation/Filter;
  public static final org.junit.runner.manipulation.Filter ALL;

  // Method descriptor #16 ()V
  // Stack: 1, Locals: 1
  public Filter();
    0  aload_0 [this]
    1  invokespecial java.lang.Object() [1]
    4  return
      Line numbers:
        [pc: 0, line: 17]
      Local variable table:
        [pc: 0, pc: 5] local: this index: 0 type: org.junit.runner.manipulation.Filter

  // Method descriptor #22 (Lorg/junit/runner/Description;)Lorg/junit/runner/manipulation/Filter;
  // Stack: 3, Locals: 1
  public static org.junit.runner.manipulation.Filter matchMethodDescription(org.junit.runner.Description desiredDescription);
    0  new org.junit.runner.manipulation.Filter$2 [2]
    3  dup
    4  aload_0 [desiredDescription]
    5  invokespecial org.junit.runner.manipulation.Filter$2(org.junit.runner.Description) [3]
    8  areturn
      Line numbers:
        [pc: 0, line: 48]
      Local variable table:
        [pc: 0, pc: 9] local: desiredDescription index: 0 type: org.junit.runner.Description

  // Method descriptor #26 (Lorg/junit/runner/Description;)Z
  public abstract boolean shouldRun(org.junit.runner.Description arg0);

  // Method descriptor #28 ()Ljava/lang/String;
  public abstract java.lang.String describe();

  // Method descriptor #30 (Ljava/lang/Object;)V
  // Stack: 2, Locals: 3
  public void apply(java.lang.Object child) throws org.junit.runner.manipulation.NoTestsRemainException;
     0  aload_1 [child]
     1  instanceof org.junit.runner.manipulation.Filterable [4]
     4  ifne 8
     7  return
     8  aload_1 [child]
     9  checkcast org.junit.runner.manipulation.Filterable [4]
    12  astore_2 [filterable]
    13  aload_2 [filterable]
    14  aload_0 [this]
    15  invokeinterface org.junit.runner.manipulation.Filterable.filter(org.junit.runner.manipulation.Filter) : void [5] [nargs: 2]
    20  return
      Line numbers:
        [pc: 0, line: 93]
        [pc: 7, line: 94]
        [pc: 8, line: 96]
        [pc: 13, line: 97]
        [pc: 20, line: 98]
      Local variable table:
        [pc: 0, pc: 21] local: this index: 0 type: org.junit.runner.manipulation.Filter
        [pc: 0, pc: 21] local: child index: 1 type: java.lang.Object
        [pc: 13, pc: 21] local: filterable index: 2 type: org.junit.runner.manipulation.Filterable

  // Method descriptor #38 (Lorg/junit/runner/manipulation/Filter;)Lorg/junit/runner/manipulation/Filter;
  // Stack: 5, Locals: 3
  public org.junit.runner.manipulation.Filter intersect(org.junit.runner.manipulation.Filter second);
     0  aload_1 [second]
     1  aload_0 [this]
     2  if_acmpeq 12
     5  aload_1 [second]
     6  getstatic org.junit.runner.manipulation.Filter.ALL : org.junit.runner.manipulation.Filter [6]
     9  if_acmpne 14
    12  aload_0 [this]
    13  areturn
    14  aload_0 [this]
    15  astore_2 [first]
    16  new org.junit.runner.manipulation.Filter$3 [7]
    19  dup
    20  aload_0 [this]
    21  aload_2 [first]
    22  aload_1 [second]
    23  invokespecial org.junit.runner.manipulation.Filter$3(org.junit.runner.manipulation.Filter, org.junit.runner.manipulation.Filter, org.junit.runner.manipulation.Filter) [8]
    26  areturn
      Line numbers:
        [pc: 0, line: 105]
        [pc: 12, line: 106]
        [pc: 14, line: 108]
        [pc: 16, line: 109]
      Local variable table:
        [pc: 0, pc: 27] local: this index: 0 type: org.junit.runner.manipulation.Filter
        [pc: 0, pc: 27] local: second index: 1 type: org.junit.runner.manipulation.Filter
        [pc: 16, pc: 27] local: first index: 2 type: org.junit.runner.manipulation.Filter

  // Method descriptor #16 ()V
  // Stack: 2, Locals: 0
  static {};
     0  new org.junit.runner.manipulation.Filter$1 [9]
     3  dup
     4  invokespecial org.junit.runner.manipulation.Filter$1() [10]
     7  putstatic org.junit.runner.manipulation.Filter.ALL : org.junit.runner.manipulation.Filter [6]
    10  return
      Line numbers:
        [pc: 0, line: 21]

  Inner classes:
    [inner class info: #2 org/junit/runner/manipulation/Filter$2, outer class info: #0
     inner name: #0, accessflags: 8 static],
    [inner class info: #7 org/junit/runner/manipulation/Filter$3, outer class info: #0
     inner name: #0, accessflags: 0 default],
    [inner class info: #9 org/junit/runner/manipulation/Filter$1, outer class info: #0
     inner name: #0, accessflags: 8 static]
}

GWTTestCase扩展了JUnit3测试用例,在JUnit3中,测试方法确实应该从
test
开始


原因是JUnit就是这样设计的:它在测试用例中搜索从
test
开始的公共void方法。这是在Java5之前完成的,当时注释还不存在。如今,JUnit4(和5)使用注释来“标记”测试方法。

GWTTestCase扩展了JUnit3测试用例,而在JUnit3中,测试方法确实应该从
测试开始

原因是JUnit就是这样设计的:它在测试用例中搜索从
test
开始的公共void方法。这是在Java5之前完成的,当时注释还不存在。如今,JUnit4(和5)使用注释来“标记”测试方法。

除了已经回答的“技术上需要它吗”问题之外;你也可以考虑约定。

我见过的大多数单元测试。。。一定要从testWhatever()开始

要点是:命名是编写干净、可读、可维护代码的核心元素。生产代码也是如此;但是,很多人认为测试代码比生产代码更重要。。。因此,编写干净、可读、可维护的测试代码是软件开发的一个重要部分

换句话说:可能大多数人都希望测试方法是从“测试”开始的。但最终:问题是,这些名称说明了实际测试的内容;所以test(),test1()。。。对于测试方法来说,诸如此类的名称都是非常糟糕的

(旁注:如果您对编写好的测试感兴趣,请查看assertThat;并且忘记使用任何其他断言调用)。

除了已经回答的问题“技术上是否需要”之外;你也可以考虑约定。

我见过的大多数单元测试。。。一定要从testWhatever()开始

要点是:命名是编写干净、可读、可维护代码的核心元素。生产代码也是如此;但是,很多人认为测试代码比生产代码更重要。。。因此,编写干净、可读、可维护的测试代码是软件开发的一个重要部分

换句话说:可能大多数人都希望测试方法是从“测试”开始的。但最终:问题是,这些名称说明了实际测试的内容;所以test(),test1()。。。对于测试方法来说,诸如此类的名称都是非常糟糕的


(旁注:如果您对编写好的测试感兴趣,请查看assertThat;忘记使用任何其他断言调用)。

如果我希望在扩展gwtTestCase的类中使用“非测试用例”方法,该怎么办。这是可能的?如果我在该类中创建了任何不带前缀“test”的函数,不管它是否私有,我都会得到该初始化错误。如果您得到一个错误,并且您的问题是关于该错误的,那么您的问题应该包含该错误的完整堆栈跟踪。自从我上次使用JUnit 3已经有好几年了,它已经过时了,我也从来没有使用过GWT,但是顺便说一句,JUnit shoiuldn并不关心一个不是从test开始的方法。先生,我已经添加了堆栈traceNo。您已经发布了一些类似于对JUnit筛选器类进行反编译的结果,如果我希望在扩展gwtTestCase的类中使用“非测试用例”方法,该怎么办。这是可能的?如果我在该类中创建了任何不带前缀“test”的函数,不管它是否私有,我都会得到该初始化错误。如果您得到一个错误,并且您的问题是关于该错误的,那么您的问题应该包含该错误的完整堆栈跟踪。自从我上次使用JUnit 3已经有好几年了,它已经过时了,我也从来没有使用过GWT,但是顺便说一句,JUnit shoiuldn并不关心一个不是从test开始的方法。先生,我已经添加了堆栈traceNo。您已经发布了一些类似于JUnit过滤器类反编译结果的内容。实际上,我在这里使用的名字只是为了让事情变得简单。我实际上并没有使用像test、test1这样的名称。实际上,我在这里使用的名字只是为了让事情变得简单。我实际上不使用像test、test1这样的名称。