Вы столкнулись с проблемой с Стиранием универсального типа из Java .
Когда Mockito создает и вводит макеты, service
на самом деле выглядит просто Object
или Any
:
protected lateinit var service: Any
Таким образом, сам макет создается как макет Object
.
Вместо этого яПредлагаем вам иметь все, что связано с фактическим тестовым классом Mockito .
internal abstract class TestUnitController<CONTROLLER: Any, SERVICE: Any> {
protected abstract val service: SERVICE
protected abstract fun controllerCall(): CONTROLLER.() -> Unit
protected abstract fun serviceCall(): SERVICE.() -> Any?
@Test
fun `when service returns error should throw ResponseStatusException`() {
testControllerServiceError(service, serviceCall()) { controllerCall() }
}
protected fun <U> testController(value: U, assertions: () -> Unit) {
testController(service, serviceCall(), value) { assertions() }
}
}
@RunWith(MockitoJUnitRunner::class)
internal class TestUnitCreateCompanyController : TestUnitController<CreateCompanyController, CompanyService>() {
@Mock
override lateinit var service: CompanyService
@InjectMocks
private lateinit var controller: CreateCompanyController
private val request = CompanyCreateRequest("LOL SARL")
override fun controllerCall(): CreateCompanyController.() -> Unit = { createCompany(request) }
override fun serviceCall(): CompanyService.() -> Any? = { createCompany(any()) }
@Test
fun `when create company service successful should return created company`() {
val domain = CompanyDomain(name = request.name)
testController(domain) {
controller.createCompany(request).run {
uuid.shouldEqual(domain.uuid.toString())
name.shouldEqual(domain.name)
}
}
}
}