сервис не внедряется в SpringMvcTest - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть следующий тест для контроллера (в основном, общий c тест контроллера CRUD)

@ExtendWith(SpringExtension::class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS) 
@WebMvcTest(ChallengeController::class)
class ChallengeControllerTest: CrudControllerTest<Challenge, Long>() {
    override val clazz: Class<Challenge> = Challenge::class.java
    override val path: String = "challenges"
    override fun getId(id: Long) = id
}

abstract class CrudControllerTest<T: GamificationObject<ID>, ID> {
    protected abstract val clazz: Class<T>
    protected abstract val path: String

    @MockBean
    private lateinit var challengeService: ChallengeService

    @MockBean
    private lateinit var crudService: CrudService<T, ID>
    private var easyRandom: EasyRandom = getEasyRandom()
    private  var objectMapper = ObjectMapper()

    @Autowired
    private lateinit var mockMvc: MockMvc
    protected abstract fun getId(id: Long): ID

    @Test
    fun `should get by id`() {
        val entity = easyRandom.nextObject(clazz)
        val id: ID = getId(1)

        `when`(crudService.findById(id)).thenReturn(entity)

        mockMvc.get("/$path/{entityId}", id)
            .andExpect {
                status { isOk }
            }

        Mockito.verify(this.crudService, Mockito.times(1)).findById(id)
    }
 }

И это тестируемый контроллер

@RestController
@RequestMapping("/challenges")
class ChallengeController(private val challengeService: ChallengeService): 
CrudController<Challenge, Long>(challengeService) {

}

ChallengeService

interface ChallengeService: CrudService<Challenge, Long>

@Service
class ChallengeServiceImpl(private val challengeRepository: 
ChallengeRepository): ChallengeService, CrudServiceImpl<Challenge, Long>(challengeRepository) {
     override val entityName: String = "challenge"
}

Я получаю следующую ошибку

16: 42: 42.210 [main] [] WARN osw c .s.GenericWebApplicationContext - Исключительная ситуация при инициализации контекста - отмена refre sh попытка: org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка создания бина с именем 'challengeController', определенным в файле [/ home / javier / work / profile / src / main / gamification-backend-new / target / classes / es /profile/gamification/controller/ChallengeController.class]: неудовлетворенная зависимость, выраженная через параметр конструктора 0; вложенное исключение - org.springframework.beans.factory. NoSuchBeanDefinitionException : Нет подходящего компонента типа 'es.profile.gamification.service.ChallengeService' доступно: ожидается как минимум 1 компонент, который соответствует требованиям в качестве кандидата на автопрокладку. Аннотации зависимостей: {}

По сути, компонент ChallengeService не находится в контексте Spring (несмотря на то, что он имеет @MockBean) при создании ChallengeController. Есть идеи почему? Я попытался удалить наследование в ChallengeControllerTest, и он отлично работает.

Кстати, если я нормально запускаю приложение, я могу использовать ChallengeController (как здесь) для операций CRUD и работает правильно.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...