【问题标题】:Why does junit say my boolean test should be void?为什么junit说我的布尔测试应该是无效的?
【发布时间】:2014-07-31 04:42:35
【问题描述】:

我在谷歌上搜索并在许多不同的网站上点击了一个又一个的链接,但没有一个可用的答案对我有帮助。这是不幸的,因为一些网站引用了相同的答案,我无法解决我的问题。那个链接是 (Junit testing for a boolean method)...

尝试运行测试的输出是:“方法 testAddObject() 应该是无效的。”实际方法是一个布尔方法,如果我将测试设置为 void,我会得到一个不同的错误。我不能随便让它作废。

我将使用代码 sn-ps。首先是我的代码,然后是我的 jUnit 测试。

代码:

public boolean add(Object ob) {
    boolean isSuccessful = true;

    /**
     * if array is full, get new array of double size,
     * and copy items from old array to new array
     */
    if (isFull()) 
    {
        expandArray();
    } 
    else if (!isFull())
    {
        // add new item; update numItems
        items[numItems] = ob;
        numItems++;         
    }
    else
        isSuccessful = false;

    return isSuccessful;            
} // end add

联合测试:

@Test
public boolean testAddObject() {
    boolean result = true;
    boolean ans;
    AList arraylist = new AList(3);
    arraylist.add("apple");
    arraylist.add("pear");
    ans = arraylist.add("melon");
    return ans == result;
}

【问题讨论】:

    标签: java junit boolean


    【解决方案1】:

    所有 JUnit 测试方法都应该是无效的。它在测试断言中确认您的代码是否产生了预期的输出。对于您的方案,assertTrue 方法将检查您的方法的输出是否返回 true

    还有其他类型的断言,例如assertEqualsassertFalse。有关不同类型断言的更多信息,请查看documentation

    所以你可以像这样修改你的测试用例

    @Test
    public void testAddObject() {
        boolean ans;
        AList arraylist = new AList(3);
        arraylist.add("apple");
        arraylist.add("pear");
        ans = arraylist.add("melon");
    
        assertTrue(ans);
    }
    

    其中assertTrue 检查 ans 是一个布尔值,其值为true

    【讨论】:

      【解决方案2】:

      JUnit 方法不能有返回类型,因此您可以通过以下方式测试是否成功:

      @Test
      public void testAddObject() {
      //Your data setup and invocation of the add method
      assertTrue(ans == result);
      }
      

      如果您想要的不仅仅是 True/False,还有很多断言选项,可以在这里找到它们:http://junit.sourceforge.net/javadoc/org/junit/Assert.html

      【讨论】:

        【解决方案3】:

        您可以使用 assert 方法来检查您的测试方法 add(object)。 assertEquals(预期结果,实际结果) assert 方法有很多变体。

        【讨论】:

          【解决方案4】:

          JUnit 从其org.junit.internal.runners.MethodValidator 类内部调用validateTestMethods,并验证例如返回类型是否为Void.TYPE

          if (each.getReturnType() != Void.TYPE)
              fErrors.add(new Exception("Method " + each.getName() + " should be void"));
          

          因此你必须使用 void 作为返回类型。

          【讨论】:

          • 谢谢。这是一个很好的解释,这就是为什么 Junit 测试必须是无效的。是的,我们可以使用assetTrue 等更改它来检查布尔值。但是我一直在想的问题是为什么 Junit 只允许 void 返回类型。
          【解决方案5】:

          是的,您的测试方法应如下所示

          @Test
          public void testAddObject() {
            // inside this method you should test add() method
            // create input object(Object obj=new Object())
            // create a instance of the class which has add()
            // call add() method with obj
            // validate return value
          }
          

          【讨论】:

            【解决方案6】:

            因为 JUnit 的工作方式是调用这些方法。如果出现以下情况,这些方法将给予 JUnit 关注(标记为 RED/Failed):

            • 发生异常(当然)
            • 其中一个断言失败,例如assertEquals("expected text", "factual text as the result of your program")

            【讨论】:

              【解决方案7】:

              JUnit 测试方法的返回类型必须为 void。

              请断言XXX为测试结果。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-01-26
                • 1970-01-01
                • 2016-08-29
                • 2020-02-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多