Использование констант из класса в тестовом классе JUnit - PullRequest
0 голосов
/ 23 мая 2018

В настоящий момент я довольно посредственный в Java и новичок в JUnit, но я не могу найти ответ на этот вопрос в другом месте.

Я хочу использовать постоянную переменную, определенную в классе, который я тестирую, в самом тестовом примере Junit, но, поскольку это статический финал, он недоступен.

Класс, который я тестирую, выглядит следующим образом:

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);

    }

(геттер определен, я просто не включил его здесь для краткости)

Однако (конечно) sadc.NUM_LOCS недоступен, потому что он виден тольков MyClass.

Как я могу получить доступ к этому из теста JUnit (5)?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы пытались использовать Powermockito.Whitebox имеет getInternalState.

посмотрите, поможет ли это

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

0 голосов
/ 23 мая 2018

Простой ответ

Сделать переменную 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);
}
...