全局变量的值在 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)
我写了一个简单的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)