Поле testService в com.test.controller.TestController требуется компонент типа com.test.service.TestService, который не может быть найден - PullRequest
0 голосов
/ 30 марта 2020

Мое приложение работает нормально при запуске и сталкивается со странной проблемой при написании модульного теста для контроллера. Выглядит очень просто c и просто, но застряло здесь надолго. Я попробовал несколько вариантов, включая Mockito.Annotations, добавив Qualifier с именем бина, как упоминалось в Baeldung, но все равно получил ошибку basi c. Пожалуйста, помогите решить эту проблему.

Класс контроллера:

@Controller
@EnableAutoConfiguration
@Component
public class UserController {
    private static final Logger LOG = LoggerFactory.getLogger(UserController .class);

    @Autowired
    @Qualifier("userService")
    private userService userService;
}

Сервисный интерфейс:

public interface UserService {
    public User getUserById(Integer userId);
}

Реализация сервиса

@Service
public class UserServiceImpl implements UserService {
    private static final Logger LOG = LoggerFactory.getLogger(UserServiceImpl.class);
     @Autowired
    RecordService recordService;
    @Autowired
    UserDao userDao;
}

Тестовый класс

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = { UserController.class, UserService.class })
public class UserControllerTest {

    private MockMvc mockMvc;

    @InjectMocks
    UserController userController;

    @Mock
    UserService userService;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this); // tried this to see if it helps
        mockMvc = MockMvcBuilders.standaloneSetup(testController).build();
    }

    @Test
    public void testWelcome() throws Exception {
        // Mocking Controller
        testController = mock(TestController.class);
        this.mockMvc.perform(get("/")).andExpect(status().isOk()) .andExpect(view().name("Welcome to Test-Service."));
    }
}

Мое приложение работает нормально при запуске и сталкивается со странной проблемой при написании модульного теста для контроллера. Выглядит очень просто c и просто, но застряло здесь надолго. Я попробовал несколько вариантов, включая Mockito.Annotations, добавив Qualifier с именем бина, как упоминалось в Baeldung, но все равно получил ошибку basi c. Пожалуйста, помогите в решении этой проблемы.

***************************
APPLICATION FAILED TO START
    ***************************   
Field testService in com.test.controller.UserController required a bean of type 'com.service.UserService' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)
    - @org.springframework.beans.factory.annotation.Qualifier(value=testService)
Action:
Consider defining a bean of type 'com.service.UserService' in your configuration.

1 Ответ

0 голосов
/ 30 марта 2020

Итак, вы загружаете контроллер и sh, чтобы смоделировать фактическую службу, к которой обращается контроллер. Такой тест может быть написан по двум причинам:

  1. Контроллер имеет некоторый код, который следует проверять на уровне «модульных тестов». Для этого вам совсем не нужна пружина - запустите тест с Mockito Runner, вставьте Mock службы в «тестируемый класс контроллера» и проверьте код. Общая рекомендация / наилучшая практика - хранить минимальный код в контроллере и не создавать обширный код на этом уровне.

  2. Вы хотите убедиться, что контроллер определен правильно (со всеми отображениями , аннотации и все). Для такого рода тестов у Spring mvc уже есть решение, которое вы, похоже, пытаетесь изобрести заново: @WebMvcTest. Он выполняет следующее:

    • Создает в памяти «mini mvc» (диспетчеризацию инфра) - с чем вы можете взаимодействовать с помощью специального класса Mock MVC из теста, определять ожидания и « Звоните по запросу.
    • Запускает часть вашего приложения с контроллерами, отображаемыми в этом фиктивном движке.
    • Автоматически настраивается таким образом, чтобы не загружать @Service / @Repository аннотированные классы - только оставшийся контроллер ( s).
    • Служба будет проверена, и ожидания от нее можно будет указать в тесте.

Существует множество руководств по тестированию Mock MVC , быстрый поиск в Google показывает этот например

...