2017-08-31 41 views
0

我開始進行單元測試。我有一個方法,它給了我預期的結果,但是,JUnit說它正在生成空值。基本上,我的方法是生成偶數。我的代碼如下所示:一種方法在JUnit中生成預期結果,但它表示爲空

我的類:

import java.util.ArrayList; 

public class BasicCommandsReview { 

    private ArrayList<Integer> listaDeNumeros = new ArrayList<>(); 
    private ArrayList<Integer> evenNumbersAsString = new ArrayList<>(); 

    void printEvenNumbers(int num) { 
     for (int i=1; i<=num; i++) { 
      if (i%2==0) { 
       listaDeNumeros.add(i); 
      } 
     } 

     int j=0; 

     while(j < evenNumbersAsString.size() - 1){ 
      System.out.print(evenNumbersAsString.get(j) + ","); 
      j++; 
     } 
     System.out.print(evenNumbersAsString.get(j)); 
    } 

    void evenNumbersAsString(int num){ 

     int j=0; 

     for (int i=1; i<=num; i++) { 
      if (i%2==0) { 
       evenNumbersAsString.add(i); 
      } 
     } 
      while(j < evenNumbersAsString.size() - 1){ 
       System.out.print(evenNumbersAsString.get(j) + ","); 
       j++; 
      } 
      System.out.print(evenNumbersAsString.get(j)); 
     } 
} 

我的測試類:

import org.junit.Test 

class BasicCommandsReviewTest extends GroovyTestCase { 

    BasicCommandsReview commandReview = new BasicCommandsReview() 

    @Test 
    void testEvenNumberAsString_Even() { 
     assertEquals("Array par -OK", "2,4,6,8,10,12", commandReview.evenNumbersAsString(12)) 
    } 

    @Test 
    void testEvenNumberAsString_Odd() { 
     assertEquals("Array impar -OK", "2,4,6,8,10,12,14", commandReview.evenNumbersAsString(15)) 
    } 
} 

日誌當我運行一個測試,我得到:

2,4,6,8,10,12 
junit.framework.ComparisonFailure: Array par -OK 
Expected :2,4,6,8,10,12 
Actual :null 


2,4,6,8,10,12,14 
junit.framework.ComparisonFailure: Array impar -OK 
Expected :2,4,6,8,10,12,14 
Actual :null 


    at junit.framework.Assert.assertEquals(Assert.java:100) 
    at junit.framework.TestCase.assertEquals(TestCase.java:261) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) 
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1466) 
    at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.callStatic(StaticMetaClassSite.java:65) 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:56) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:194) 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:222) 
    at BasicCommandsReviewTest.testEvenNumberAsString_Odd(BasicCommandsReviewTest.groovy:16) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at junit.framework.TestCase.runTest(TestCase.java:176) 
    at junit.framework.TestCase.runBare(TestCase.java:141) 
    at junit.framework.TestResult$1.protect(TestResult.java:122) 
    at junit.framework.TestResult.runProtected(TestResult.java:142) 
    at junit.framework.TestResult.run(TestResult.java:125) 
    at junit.framework.TestCase.run(TestCase.java:129) 
    at junit.framework.TestSuite.runTest(TestSuite.java:252) 
    at junit.framework.TestSuite.run(TestSuite.java:247) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131) 

Process finished with exit code 255 

在此先感謝對於所有可能來的想法

+1

這是如何編譯的?您不能使用對'void'方法的調用作爲方法參數。 –

+0

是的。這是Groovy –

+0

與您的問題無關:刪除@Test註釋。您正在運行JUnit 3測試,因此您不應該爲您的方法添加@Test。它們是測試,因爲方法名稱以'test'開始。 –

回答

6

你的方法沒有返回任何東西。它們不能是:他們有void返回類型:

void evenNumbersAsString(int num){ 

唯一的原因,你甚至可以調用該方法,方法的參數是因爲這是常規。 Java中的等價物:

assertEquals("Array par -OK", "2,4,6,8,10,12", commandReview.evenNumbersAsString(12)); 

將是一個編譯時錯誤,因爲第三個參數是void類型。我對groovy並不熟悉,但它看起來像是在處理void方法,就好像它返回Void - 這是不可實例化的,因此總是null

你是印刷東西,不返回它。如果你想用assertEquals檢查結果,你必須讓你的方法返回一個值,例如String

+0

我甚至不知道如何讓這種事情發生。我真的沒有注意到它。謝謝安迪。 –

+1

@CaioVitor請注意,如果您不打算*使用Groovy動態類型,使用'@ CompileStatic'是一個好主意,它可能會引發這種情況。 – chrylis

+0

好吧,我會做的。謝謝 –

相關問題