【问题标题】:A method generates the expected results in JUnit but it says it is null一个方法在 JUnit 中生成预期的结果,但它说它是 null
【发布时间】:2017-08-31 15:28:11
【问题描述】:

我开始进行单元测试。我有一个方法,它给了我预期的结果,但是,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

提前感谢您提出的所有想法

【问题讨论】:

  • 这如何编译?您不能使用对 void 方法的调用作为方法参数。
  • 是的。这是时髦的
  • 与您的问题无关:删除 @Test 注释。您正在运行 JUnit 3 测试,因此不应将 @Test 添加到您的方法中。它们是测试,因为方法名称以 test 开头。
  • 我改变了,它继续工作。我不知道。谢谢斯特凡
  • 别忘了在某个时候接受答案 ;-)

标签: java unit-testing intellij-idea groovy junit


【解决方案1】:

您的方法没有返回任何内容。他们不可能:他们有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.

【讨论】:

  • 我什至不知道我怎么能让这种事情发生。我真的没有注意到。谢谢安迪。
  • @CaioVitor 请注意,如果您不打算使用 Groovy 动态类型,那么使用 @CompileStatic 是个好主意,它会发现这一点。
  • 好的,我会的。谢谢
  • 我发现了那个时髦的部分!
  • @chrylis,当我添加 *@CompileStatic 时,出现如下错误:Error:(11, 9) Groovyc: [Static type checks] - Reference to method是模棱两可的。无法在 [void junit.framework.TestCase#assertEquals(java.lang.String, java.lang.String, java.lang.String), void groovy.util.GroovyTestCase#assertEquals(java.lang.String, java.lang .Object, java.lang.Object)] 错误:(16, 9) Groovyc: [静态类型检查] - 对方法的引用不明确。无法在 [void junit.framework.TestCase#assertEquals(java.lang.String, java.lang.String, java.lang.String)、void groovy.util.GroovyTest 之间进行选择
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
相关资源
最近更新 更多