Инициализация массива объектов в setUp () в JUnit - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь использовать setUp для инициализации массива объектов в JUnit для моих методов тестирования, но я делаю что-то не так, поскольку тесты выдают ошибки (исключение нулевого указателя). Они работают нормально, когда я инициализирую массивы в самих тестовых методах, но это, очевидно, не идеально. Кто-нибудь может указать, что я здесь делаю не так?

class MainTest {

    Lord baratheons[];
    Lord starks[];

    //Setup & Teardown

    @Before
    static void setUp() throws Exception {
        Lord baratheons[] = new Lord[3];
        baratheons[0] = new Lord("Robert", 15);
        baratheons[1] = new Lord("Renly", -5);
        baratheons[2] = new Lord("Stannis", 30);
        System.out.println("Baratheons initialised!");

        Lord starks[] = new Lord[3];
        starks[0] = new Lord("Robb", -60);
        starks[1] = new Lord("Eddard", 0);
        starks[2] = new Lord("Jon", 90);
        System.out.println("Starks initialised!");
    }

    //Tests

    @Test
    void testGratefulLord() {
//      Lord baratheons[] = new Lord[3];
//      baratheons[0] = new Lord("Robert", 15);

        int x = baratheons[0].getRelationship();
        baratheons[0].giveFief();
        assertEquals(baratheons[0].getRelationship(), (x+=10));

    }

РЕДАКТИРОВАТЬ:

N.B В дополнение к выполнению шагов, описанных в приведенных ниже решениях, я хотел бы отметить для потомков, что я также использовал неправильный тег для установки. Поскольку это JUnit 5, тег @BeforeEach. @Before - это тег для JUnit 4, поэтому метод установки не вызывался. Я надеюсь, что это полезно для будущих пользователей.

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Проблема здесь связана с областью применения ваших переменных baratheons и starks.

Прочтите Спецификацию Java в Сфере декларации , чтобы лучше понять проблему.

Надеюсь, это поможет вам понять проблему немного подробнее.

Ваш код должен быть следующим:

class MainTest {

    private Lord[] baratheons;
    private Lord[] starks;

    //Setup & Teardown

    @Before
    public void setUp() throws Exception {
        baratheons= new Lord[3];
        baratheons[0] = new Lord("Robert", 15);
        baratheons[1] = new Lord("Renly", -5);
        baratheons[2] = new Lord("Stannis", 30);
        System.out.println("Baratheons initialised!");

        starks = new Lord[3];
        starks[0] = new Lord("Robb", -60);
        starks[1] = new Lord("Eddard", 0);
        starks[2] = new Lord("Jon", 90);
        System.out.println("Starks initialised!");
    }

    @Test
    public void testGratefulLord() {
        int x = baratheons[0].getRelationship();
        baratheons[0].giveFief();
        assertEquals(baratheons[0].getRelationship(), (x += 10));
   }
}
0 голосов
/ 25 апреля 2018

Проблема здесь в том, что вы повторно объявляете массивы внутри вашего setUp() метода. Это портит область действия объектов, которые вы хотите использовать.

Удалите static из метода setUp(), так как он не нужен.

Измените свой код с

Lord baratheons[] = new Lord[3];
Lord starks[] = new Lord[3];

до

baratheons = new Lord[3];
starks = new Lord[3];

Наконец, вам нужно изменить свои методы на public. Зачем? Потому что JUnit использует отражение за кулисами, и они должны быть публичными, чтобы его можно было распознать. Вы можете просмотреть JUnit JavaDoc и увидеть, что явно упоминается public void метод

0 голосов
/ 25 апреля 2018

setUp () не должен быть статическим.

Массивы, которые вы создаете в методе setUp (), присваиваются локальным переменным.

Lord baratheons[] = new Lord[3];

Переменная, которую вы объявляете здесь, скрывает ваш атрибут класса. Вы должны просто удалить класс здесь (Господь), чтобы назначить новый массив хорошей переменной.

baratheons = new Lord[3];

Также будьте осторожны с утверждением assert:

assertEquals(baratheons[0].getRelationship(), (x+=10));

Это утверждение работает, но использование здесь синтаксиса "+ =" может привести к ошибкам. В этом случае код довольно прост, но вы получите ясность, если извлечете оператор 'x + = 10', если хотите изменить значение x. Если вам не нужно менять значение, вы можете использовать x + 10. Вместо него

0 голосов
/ 25 апреля 2018

Удалить static из метода setUp.

Также

Lord baratheons[] = new Lord[3];

должно быть просто

baratheons = new Lord[3];

То же самое относится к starks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...