在JUnit测试类中使用类中的常量

问题描述 投票:0回答:2

我现在对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)测试用例中访问它?

java junit junit5
2个回答
0
投票

你尝试过使用Powermockito吗? Whitebox有getInternalState。

看看它是否有帮助

https://github.com/powermock/powermock/wiki/Bypass-Encapsulation


-1
投票

简单回答

公开变量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);
}
© www.soinside.com 2019 - 2024. All rights reserved.