Не уверен, как провести модульное тестирование интерфейса в Котлине с цепным блоком

#android #unit-testing #kotlin #junit

Вопрос:

Я работаю с Kotlin (для Android), а также с JUnit и Koin.

У меня есть интерфейс для использования, который выглядит так:

 interface MyInterface {  
    fun vehicle(id: String, block: VehicleInterface.() -> Unit) 
}

interface VehicleInterface {   
    fun requestVersion()
}
 

Код, вызывающий этот метод, выглядит следующим образом:

 import com.domain.protocol.thelibrary.sdk.MyInterface

// The below is injected via Koin
class SomeClass(private val myInterface: MyInterface) {    
    fun functionIWantToUnitTest(id: String) {
        myInterface.vehicle(id) {
            requestVersion()
        }
    }
}
 

Я хотел бы провести модульный тест, чтобы, когда я звоню functionIWantToUnitTest и передаю идентификатор «1», мой интерфейс.транспортное средство вызывается с идентификатором «1», и я также хотел бы убедиться, что затем вызывается запрос.

Я написал модульный тест как таковой:

     @Test
    fun `Ensure functionIWantToUnitTest calls requestVersion with the correct id`() {
    every { myInterface.vehicle("1", any()) } returns Unit
    someClass.functionIWantToUnitTest("1")

    verifySequence {
        myInterface.vehicle("1") {
            requestVersion()
        }
    }
}
 

Это не удается как таковое:

 java.lang.AssertionError: Verification failed: call 1 of 1: 
MyInterface(myInterface#1).vehicle(eq(1), eq(lambda {}))). Only one matching call to 
MyInterface(myInterface#1)/vehicle(String, Function1) happened, but arguments are not 
matching:
[0]: argument: 1, matcher: eq(1), result:  
[1]: argument: lambda {}, matcher: eq(lambda {}), result: -
 

Кто-нибудь может, пожалуйста, помочь мне понять, что я делаю не так…

Любая помощь с благодарностью принимается.