I'm trying to implement a generic spy class to be ...
# announcements
d
I'm trying to implement a generic spy class to be used in tests for interfaces derived from a base UseCase interface... is there any way to make the spies generic? Or does one have to be made for each derived interface? (See thread for code)
Copy code
interface ResultUseCase<in Request : Any, out Response> : UseCase<Request, Result<Response, DomainError>> {
    override suspend fun invoke(request: Request): Result<Response, DomainError>
}
Copy code
interface UseCase<in Request : Any, out Response> {
    suspend operator fun invoke(request: Request): Response?
}
Copy code
class ResultUseCaseSpy<Request : Any, Response>(
    var block: (suspend (Request) -> Result<Response, DomainError>)? = null
): ResultUseCase<Request, Response> {
    var request: Request? = null
        private set

    override suspend fun invoke(request: Request): Result<Response, DomainError> {
        this.request = request

        return block?.invoke(request) ?: error("No response provided for $request.")
    }
}
I want to derive from
ResultUseCase
an interface that provides the generic params:
interface SomeUseCase : ResultUseCase<SomeRequest, SomeResult>
, and still be able to spy that in my tests with one Spy implementation...