我现在对Java很平庸,对JUnit不熟悉,但我在其他地方找不到这个问题的答案。
我想在Junit测试用例本身中使用我正在测试的类中定义的常量变量,但由于它是静态final,因此它不可用。
我正在测试的课程如下:
public class MyClass {
private static final int HSIZE = 7;
private static final int NUM_LOCS = 3;
.
.
.
void generateRandomLocations() {
Random rand = new Random();
String[] hPos = new String[NUM_LOCS];
for (int i=0; i<NUM_LOCS; i++) {
hPos[i] = Integer.toString(rand.nextInt(HSIZE));
}
setLocations(hPos);
}
}
很简单,它似乎工作正常,但我想在JUnit中添加一个测试用例 - 如下所示:
@Test
void testGenerateRandomLocations() {
MyClass mc = new MyClass();
mc.generateRandomLocations();
String[] check = mc.getLocations();
assertEquals(sadc.NUM_LOCS, check.length);
}
(定义了getter,为简洁起见我还没有把它包含在这里)
但是(当然)sadc.NUM_LOCS不可用,因为它只在MyClass中可见。
如何从JUnit(5)测试用例中访问它?
你尝试过使用Powermockito吗? Whitebox有getInternalState。
看看它是否有帮助
https://github.com/powermock/powermock/wiki/Bypass-Encapsulation
简单回答
公开变量NUM_LOCS
。然而,这是一个糟糕的设计。
更好的答案
而不是静态变量,通过构造函数传递NUM_LOCS
:
public class MyClass {
private final int numLocs;
public MyClass(int numLocs) {
this.numLocs = numLocs;
}
//default ctor with default numLocs value
public MyClass() {
this.numLocs = 3;
}
//methods
}
现在,您的测试如下所示:
@Test
void testGenerateRandomLocations() {
int expectedNumLocs = 7;
MyClass mc = new MyClass(7);
mc.generateRandomLocations();
String[] check = mc.getLocations();
assertEquals(expectedNumLocs, check.length);
}
并且您可以进行测试以检查默认值是否为3:
@Test
void testGenerateRandomLocations() {
int expectedNumLocs = 3;
MyClass mc = new MyClass(); //no args
mc.generateRandomLocations();
String[] check = mc.getLocations();
assertEquals(expectedNumLocs, check.length);
}