全局变量的值在 JUnit 中变为 null

value of global variable is changing to null in JUnit

我写了一个简单的class,其中第一个函数的输出是第二个函数的输入,第二个函数的输出是第三个函数的输入。 之后,我将这些输出打印在另一个实现 JUnit @Test cases 的 class 中。

但是对于调用第二个函数的测试,我得到的 'res' 值为 null(这应该是第一个函数的输出并将其作为输入传递给第二个函数)。第三个功能也是如此。

我将 'res' 声明为全局变量。那么为什么它的值变为 null 而不是保存第一个函数的结果然后是第二个函数的结果(用于调用第三个函数)?

这是包含 3 个函数的 class:

package con.nc.junitexmples.Junit4Examples;

public class StringExample {

 public static String firstFunction() {

    String msg1 = "msg1";
    return msg1;

}

public static String secondFunction(String msg1) {

    String msg2 = msg1+"msg2";
    return msg2;

}

public static String thirdFunction(String msg2) {

    String msg3= msg2+"msg3";
    return msg3;

  }

}

这里是 class,它实现了 JUnit @Test cases 和打印输出:

package con.nc.junitexmples.Junit4Examples;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)

public class TestStringExample {

String res;

  @BeforeClass  
    public static void setUpBeforeClass() throws Exception {  
      System.out.println("\n\t\t-----JUnit cascading input Example------\n\n");  
      System.out.println("before class---->only once");  


    }  
    @Before  
    public void setUp() throws Exception {  
        System.out.println("\nbefore--->before each test case");  
    }  

    @Test  
    public void testFirstFunction(){  
        System.out.println("\ttest case: FIRST Function");  

        res = StringExample.firstFunction();
        System.out.println("\t"+res);

    }  

    @Test  
    public void testSecondFunction(){  
        System.out.println("\ttest case: SECOND Function");  

        res = StringExample.secondFunction(res);
        System.out.println("\t"+res);

    }  

    @Test  
    public void testThirdFunction(){  
        System.out.println("\ttest case: THIRD Function");  

        res = StringExample.thirdFunction(res);
        System.out.println("\t"+res);

    }  


    @After  
    public void tearDown() throws Exception {  
        System.out.println("after ---> after each test case\n\n");  
    }  

    @AfterClass  
    public static void tearDownAfterClass() throws Exception {  
        System.out.println("after class--->only once");  
    }  

}

这是我得到的输出:

    -----JUnit cascading input Example------


 before class---->only once

 before--->before each test case
     test case: FIRST Function
     msg1
 after ---> after each test case



 before--->before each test case
     test case: SECOND Function
    **nullmsg2** 
 after ---> after each test case



 before--->before each test case
    test case: THIRD Function
     **nullmsg3**
 after ---> after each test case


after class--->only once

如何将第一个函数的结果作为输入传递给第二个函数等等?

这些测试中的每一个都是自包含的、独立的,并且 res 在这些测试方法开始时的值为 null

所以,这就解释了为什么您会看到:

nullmsg2
nullmsg3

鉴于上述评论中的这个问题:

how do I pass output of first function as input to second function for second test?

您可以在一种测试方法中测试所有三个调用,如下所示:

@Test
public void testAll() {
    String res = StringExample.firstFunction();
    Assert.assertEquals("msg1", res);

    res = StringExample.secondFunction(res);
    Assert.assertEquals("msg1msg2", res);

    res = StringExample.thirdFunction(res);
    Assert.assertEquals("msg1msg2msg3", res);
}

为了将第一个函数的结果传递给第二个函数:

    @Test  
    public void testSecondFunction(){  
        System.out.println("\ttest case: SECOND Function");  
        String resFromFirstFunc = StringExample.firstFunction();
        res = StringExample.secondFunction(resFromFirstFunc);
        System.out.println("\t"+res);

    }

但是你不应该像上面的例子那样写测试,它总是通过的。 你应该使用:

Assert.assertEquals(input,output)