Я новичок во всем этом, поэтому ответ должен быть очевиден, но я не могу понять его самостоятельно: 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, а ваш тестируемый объект автоматически подключается к вашему классу тестового примера, пропущены. Что касается вашего примера, следующий код будет работать.
@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> Вы решили это, спасибо
Обратите внимание, что это делает его интеграционным, а не модульным тестом.
Ну, вы никогда не создаете ни одного экземпляра своей службы в тесте. Так что это ноль. В производственном коде он создается Spring и автоматически подключается (т.е. внедряется) в контроллер, потому что вы запускаете контейнер Spring Boot, где оба определены как bean-компоненты Spring. В тесте нет контейнера Spring.