【问题标题】:How to quickly test a Java-method in Eclipse?如何在 Eclipse 中快速测试 Java 方法?
【发布时间】:2015-01-30 11:49:29
【问题描述】:

我的 Java 代码中有一个简单的方法,例如

private int specialAdd (int a, int b) {
  if(a < 100) {
    return 100 * a + b;
  } else {
    return a + b;
  }
}

有没有办法在 Eclipse 中使用给定的参数值“运行/调试选定的代码”?我真的很想只运行这个方法并查看ab 的几个值的结果。

【问题讨论】:

  • 在你的类上写一个主方法,然后调用你的测试方法。
  • 通过运行检查只需编写一个主方法并使用参数调用此方法。如果你想有一个测试用例,可以看看 JUnit 或 Mokito 来写一个测试。
  • 应该有一种方法可以运行部件或代码,而无需编写主要方法或测试类。为私有方法编写测试也很困难。我真的很想快速检查一个函数是否符合我的想法。
  • @RuchiraGayanRanaweera 不是 Mockito。 Mockito 所做的与这里有用的任何东西完全不同。
  • @DavidWallace 用于测试。不是别的。

标签: java eclipse unit-testing debugging testing


【解决方案1】:

在没有输入参数和输出参数的情况下使用Junit:

@Test 
private void specialAdd () {
  // provide the value of a and b
  int a = 30;
  int b = 20;
  if(a < 100) {
    System.out.println("100 * a + b =" + 100 * a + b);
  } else {
    System.out.println("a + b =" + a + b);
  }
}

然后,选择方法名“specialAdd”并点击鼠标右键,选择run --> run junit test。

【讨论】:

  • 你所做的就是重写原来的方法。这不会测试原始方法。它也不能自动检测成功或失败,所以它不如一组单元测试好。这不是使用 JUnit 的正确方式。
  • 是的,我只是复制他的代码,有两点需要注意:第一个是我忘记将访问级别更改为publics;第二个是可能创建一个测试用例来使用getDeclairedMethod (String) 测试私有方法比修改它好。
【解决方案2】:

有没有办法在 eclipse 中使用给定的参数值“运行/调试选定的代码”?

不,Eclipse 需要一个常规的 main 方法或 @Test 方法作为入口点。

当我想做一个“一次性”的迷你测试时,我通常会做的是

class YourClass {
    private int specialAdd (int a, int b) {
       if(a < 100) {
           return 100 * a + b;
       } else {
           return a + b;
    }

    public static void main(String[] args) {
        System.out.println(new YourClass().specialAdd(10, 100));
    }
}

然后运行(或调试)当前类。 (专业提示:输入 main 并按 Ctrl+Space 将其展开为完整的 main 方法)


从 JDK 9 开始,您还可以使用 jshell 进行此类测试:

$ ./jshell
|  Welcome to JShell -- Version 1.9.0-internal
|  Type /help for help

-> int specialAdd(int a, int b) {
>>     if (a < 100) {
>>         return 100 * a + b;
>>     } else {
>>         return a + b;
>>     }
>> }
|  Added method specialAdd(int,int)

-> specialAdd(10, 5);
|  Expression value is: 1005
|    assigned to temporary variable $2 of type int

【讨论】:

  • 我必须在我的 Eclipse 偏好中更改哪些 alt+/ 有效?我很确定,有一个插件可以绕过编写主方法。类似于“在 main() 中运行方法”,然后会弹出一个窗口,您可以输入参数值 - 然后显示给定参数的方法的返回值。
  • 我知道没有这样的插件。在这种情况下,该方法甚至不是静态的,因此您必须输入的不仅仅是方法参数。您还需要一个表达式来创建对象以调用该方法。
  • 我可能弄错了默认键绑定。尝试输入main,然后按Ctrl+Space。
【解决方案3】:

我建议您使用 testng/junit 之类的测试框架,您可以在其中断言方法返回的值,并且可以使用它们创建可重复的测试。

但如果你想简单地用 main 测试它,你可以这样做:

 public static void main(String args[]) {
       int number = specialAdd(99, 1);
       if (number != 9901) {
            System.out.println("Expected: " + 9901 + " Actual: " + number);
       }
       if (args.length >= 2) {//with system args
           int number1 = Integer.parseInt(args[0]);
           int number2 = Integer.parseInt(args[1]);
           number = specialAdd(number1, number2);
           if (number != ...) {} 
       }
 }

【讨论】:

    【解决方案4】:

    将您的方法配置为单一测试,例如使用 JUnit。通过这种方式,您将能够分别测试这些方法。

    要使用 jUnit,请将 @Test 注释添加到您的方法中。您应该在您的方法中添加一个资产语句,以检查您的方法操作/性能。例如:

       @Test
       public void testHelloWorld() 
       {
          h.setName("World");
          assertEquals(h.getName(),"World");
          assertEquals(h.getMessage(),"Hello World!");
       }
    

    然后点击方法和Run as > JUnit Test

    您可以通过 Maven 下载 JUnit:

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
    </dependency>
    

    【讨论】:

      【解决方案5】:

      首先,您不想直接测试这样的私有方法。如果它是公开的,您将编写两个 JUnit 测试用例,一个用于通过您的方法的每个可能路径。

      public class YourClassTest {
      
          private YourClass toTest = new YourClass();
      
          @Test
          public void specialAddMultiplesSmallFirstAddendBy100() {
              int result = toTest.specialAdd(99, 7);
              assertEquals(9907, result);
          }
      
          @Test
          public void specialAddDoesNotIncreaseLargeFirstAddend() {
              int result = toTest.specialAdd(100, 7);
              assertEquals(107, result);
          }
      }
      

      如果assertEquals 的两个参数不相等,JUnit 将为每个测试用例记录失败。这使得这些测试可以添加到一组单元测试中并实现自动化。

      但由于它是私有的,因此您应该使用类似的策略来通过调用它的任何方法对其进行测试。大概在你的类中有一些公共方法,它调用specialAdd - 通过测试该公共方法,你也将隐式测试specialAdd

      【讨论】:

      • “测试”只适合我。快速测试其他人编写的代码。只是为了仔细检查我是否遗漏了什么。
      • 为谁服务并不重要。你还是应该这样做。
      • 我不同意你的看法。我想了解其他人的代码——这也包括了解他们的私有方法。添加main()-方法似乎是最简单的方法。如果我想了解刹车,我也想看看刹车蹄,而不仅仅是测试汽车是否停下来,...
      • 那么你所做的与“测试”不同。您的问题让我相信您想知道如何测试,而不是如何做其他事情。如果我要买车,我想知道刹车让车停下来;并不是说刹车蹄看起来很漂亮。
      【解决方案6】:
        private static int specialAdd (int a, int b) {
            if(a < 100) {
              return 100 * a + b;
            } else {
              return a + b;
            }
          }
        public static void main(String[] args) {
          System.out.println("" + specialAdd(10,20));
          System.out.println("" + specialAdd(11,21));
          System.out.println("" + specialAdd(12,23));
        }
      

      这是您可以运行应用程序并查看输出的方式。 如果要调试,请先标记断点。 比右键单击您的 java 类并选择“调试为”-> java 应用程序。 从工具栏单击 step over 时,您将看到光标在断点间移动。

      【讨论】:

      • 这个答案与其他答案有何不同?
      • 马杜丹先生。这也建议在 Eclipse 中进行调试选项。绝对可以使用 Junit 测试用例,但他想要一种更简单的方式在 Eclipse 中进行调试。
      • 你可能想编辑你的答案。把你的建议作为文本而不是代码。
      【解决方案7】:

      在 Eclipse 中,您可以创建一个剪贴簿页面(扩展名为 .jpage 的文件)

      在那里,您可以编写 java 代码并像在方法中一样执行。

      https://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftask-create_scrapbook_page.htm

      例如,在包中创建一个test.jpage,其中包含您要测试的类和方法。 在那里写你的Java代码

      int a = ..., b = ...;
      if(a < 100) {
          return 100 * a + b;
      } else {
          return a + b;
      }
      

      或者你可以调用你的类的方法。

      com.mycomp.TestedClass testedInstance = new com.mycomp.TestedClass();
      for(int a=0,b=0; b < 100 && a < 100; a++,b++) {
          System.out.println(testedInstance.specialAdd(a,b));
      }
      

      遗憾的是,必须写出此文件中的导入。 您可以通过选择它 > 右击 > 执行来运行您编写的代码。

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • @Bentaye 谢谢提醒,我加了一个例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2011-12-04
      • 2017-06-29
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2020-03-02
      相关资源
      最近更新 更多