Перво-наперво - вы запускаете тест JUnit (4 или 5). Но вы не указываете, что он должен инициализировать контекст приложения Spring.
Итак, если вы используете junit 4, добавьте следующее:
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
....
Если вы используете junit 5, тогда он выглядит немного иначе:
@ExtendWith(SpringExtension.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
...
Еще одна вещь, которую нужно обработать, - это использование UserService
. Вы должны убедиться (поместив точку останова или что-то еще в коде контроллера), что ссылка на userService инициализирована и это точно такой же объект, как вы определили в @MockBean UserService userService
.
Затем как @ Ume sh упомянул, вам нужно указать ожидание от этой заглушки. Для этого используйте библиотеку mockito, как и в обычных модульных тестах:
Mockito.when(userService.whateverYouCallFromController(/*parameters if any*/)).thenReturn(... whatever you return there ...);
@MockBean
аннотация создает mock / stub (с помощью mockito) и помещает его в контекст приложения во время создания spring. контекст приложения. Поскольку вы вызываете его в тестируемом методе контроллера, вы должны указать, что вы ожидаете от него, чтобы он вернул такой вызов, не выполняя фактический бизнес-лог. c позади.
Последнее - вы упомянули H2 в вопрос, но для WebMvcTests он в основном не имеет значения - он создает часть ваших bean-компонентов, относящуюся к веб-уровню, и даже не создает репозитории, в которых вы должны вызывать базу данных.