У меня есть следующий тест для контроллера (в основном, общий 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 и работает правильно.
Заранее спасибо.