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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在JUnit测试类中使用类中的常量相关的知识,希望对你有一定的参考价值。

我现在对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);
}

以上是关于在JUnit测试类中使用类中的常量的主要内容,如果未能解决你的问题,请参考以下文章

无法访问junit测试类中的包私有方法

Spring 整合Junit

Maven 和 JUnit 5:在一个类中运行单个测试

SSM框架中测试单元的使用,spring整合Junit

如何在用 Kotlin 编写的 JUnit 5 测试类中注入 Spring bean?

Junit测试类中如何调用Http通信