JUnit и SPring Boot - объект хорошо определен в контроллере, но не в тесте

Я новичок во всем этом, поэтому ответ должен быть очевиден, но я не могу понять его самостоятельно: op

Я работаю над простым приложением Spring Boot и «пытаюсь» настроить тест JUnit.

В моем контроллере есть этот код:

@Controller
public class UserController {

    @Autowired
    private OrderInfoService orderInfoService;

    @RequestMapping(value = "/single", method = RequestMethod.GET)
    public ResponseEntity<List<OrderInfo>> orderinfo() {

        List<OrderInfo> orderInfo = orderInfoService.getOrderInfo("ca1121a");
        System.out.println("Created output string :" + orderInfo.toString());
        return new ResponseEntity<List<OrderInfo>>(orderInfo, HttpStatus.OK);
    }
}

Это только отображение тестовой страницы в «/ single». Содержимое orderInfo отображается как в командной строке, так и на моей веб-странице. Хороший!

Теперь я пытаюсь настроить тест JUnit следующим образом:

public class OrderInfoServiceImplTest {
    // Call class under test
    private OrderInfoService orderInfoService;

    @Test
    public void testGetOrderInfo() {
        System.out.println("Test - getOrderInfo");

        String res = "[OrderInfo :typeNameca1121a - retroFit ]" ;   
        List<OrderInfo> orderInfo = orderInfoService.getOrderInfo("ca1121a");
        System.out.println("Created output orderInfo");

        System.out.println("\t" + orderInfo.size());

        Assert.assertEquals(res, orderInfo.get(0).toString());
    }
}

Это дает мне исключение с нулевым указателем:

[INFO] Running OrderInfoServiceImplTest Test - getOrderInfo [ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.178 s <<< FAILURE! - in OrderInfoServiceImplTest [ERROR] testGetOrderInfo(OrderInfoServiceImplTest) Time elapsed: 0.115 s <<< ERROR! java.lang.NullPointerException at com.devglan.service.impl.OrderInfoServiceImplTest.testGetOrderInfo(OrderInfoServiceImplTest.java:23)

Я не понимаю, почему мой объект хорошо определен в контроллере, но не в тесте, я использую точно такую ​​же команду. Связано ли это с @autowired в контроллере (я должен сказать, что пока не понимаю)?

Любая помощь будет оценена. Спасибо

Ну, вы никогда не создаете ни одного экземпляра своей службы в тесте. Так что это ноль. В производственном коде он создается Spring и автоматически подключается (т.е. внедряется) в контроллер, потому что вы запускаете контейнер Spring Boot, где оба определены как bean-компоненты Spring. В тесте нет контейнера Spring.

JB Nizet 18.10.2018 08:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
233
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Некоторые аннотации, которые заставляют ваш класс тестового примера запускаться под управлением тестовой среды Spring, а ваш тестируемый объект автоматически подключается к вашему классу тестового примера, пропущены. Что касается вашего примера, следующий код будет работать.

@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderInfoServiceImplTest {
    // autowire class under test
    @Autowired
    private OrderInfoService orderInfoService;

    @Test
    public void testGetOrderInfo() {
        System.out.println("Test - getOrderInfo");

        String res = "[OrderInfo :typeNameca1121a - retroFit ]" ;   
        List<OrderInfo> orderInfo = orderInfoService.getOrderInfo("ca1121a");
        System.out.println("Created output orderInfo");

        System.out.println("\t" + orderInfo.size());

        Assert.assertEquals(res, orderInfo.get(0).toString());
    }
}

Большой! Мне также не хватало зависимости: <artifactId> spring-boot-starter-test </artifactId> Вы решили это, спасибо

alak 18.10.2018 09:15

Обратите внимание, что это делает его интеграционным, а не модульным тестом.

Hans Westerbeek 18.10.2018 09:58

Другие вопросы по теме