JMockit - Экземпляр класса, который должен быть протестирован, является нулевым - PullRequest
0 голосов
/ 10 февраля 2019

Итак, я начал использовать JMockit и JUnit для тестирования своего кода.

Я написал класс и хотел протестировать этот класс.Класс выглядит следующим образом -

public final class KingdomDAOImpl implements KingdomDAO {

private Map<KingdomType, Kingdom> kingdomEmblemMap;

@Inject
public KingdomDAOImpl(final Map<KingdomType, Kingdom> kingdomEmblemMap) {
    this.kingdomEmblemMap = kingdomEmblemMap;
}

@Override
public Map<KingdomType, Kingdom> getKingdoms() {
    return kingdomEmblemMap;
}
}

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

public class KingdomDAOTest {

@Injectable
private static Map<KingdomType, Kingdom> kingdomEmblemMap;

@Tested
private static KingdomDAOImpl kingdomDAO;

@BeforeClass
public static void beforeClass() {
    kingdomEmblemMap = new HashMap<>();
}

@Test
public void getKingdomsTest() {
    System.out.println("=========+> " + kingdomDAO);
    final Map<KingdomType, Kingdom> actualKingdomEmblemMap = kingdomDAO.getKingdoms();

    Assert.assertEquals(kingdomEmblemMap, actualKingdomEmblemMap);
}
}

Теперь проблема в том, что экземпляр kingdomDAO это null, что я не могу понять, почему.Из-за этого kindomDAO.getKingdoms() выдает NullPointerException.

Любые идеи о том, как действовать дальше?

РЕДАКТИРОВАТЬ: Я использовал версию JMockit 1.8.Я попытался обновить до 1.45 и заменить аннотацию @Injectable на @Tested, но проблема все еще остается.

1 Ответ

0 голосов
/ 10 февраля 2019

JMockit немного изменился с момента моего последнего использования.
Я могу порекомендовать вам, всегда читать примечания к выпуску !

Версия 1.42

JMockit теперь требует использования параметра инициализации JVM "-javaagent"

Версия 1.45

Насмешливые аннотации (@Mocked, @Capturing и@Injectable) больше не может использоваться в интерфейсах сбора и сопоставления Java SE по двум причинам: 1) в Java 8+ такие интерфейсы включают в себя методы по умолчанию, которые действительно насмехаются, легко вызывая неожиданные результаты в тестах;2) издевательство над указанными интерфейсами (и, в более общем смысле, над всеми ценностно-ориентированными типами, которые в основном инкапсулируют состояние без сложного поведения в методах), является хорошо известной плохой практикой.В конкретном случае наличия поля @Injectable collection / map, которое должно быть введено в объект @Tested, тест должен быть изменен на использование @Tested также в поле collection / map, с объявлением, расположенным перед целью@Tested field.


Хотя я не буду кодировать такой тест, рабочий пример:

public class KingdomDAOtest {
    @Tested
    Map<KingdomType, Kingdom> kingdomEmblemMap = new HashMap<>();

    @Tested
    KingdomDAOImpl kingdomDAO;

    @Test
    public void getKingdomsTest() {
        System.out.println("=========+> " + kingdomDAO);
        final Map<KingdomType, Kingdom> actualKingdomEmblemMap = kingdomDAO.getKingdoms();

        Assert.assertEquals(kingdomEmblemMap, actualKingdomEmblemMap);
    }
}
...