Testing 使用Kotlin为http方法设置Spek测试?

Testing 使用Kotlin为http方法设置Spek测试?,testing,kotlin,http-method,ratpack,spek,Testing,Kotlin,Http Method,Ratpack,Spek,如何使用kotlin启动spek测试,以测试是否调用了HTTP方法post?让我大吃一惊的是,我在模拟上下文方面遇到了困难。我想传入一个方法,而不是HttpMethod.POST来触发else块 当前失败,消息为- handlers.AHandlerTest > initializationError FAILED org.mockito.exceptions.base.MockitoException: Cannot mock/spy class ...hand

如何使用kotlin启动spek测试,以测试是否调用了HTTP方法post?让我大吃一惊的是,我在模拟上下文方面遇到了困难。我想传入一个方法,而不是HttpMethod.POST来触发else块

当前失败,消息为-

    handlers.AHandlerTest > initializationError FAILED
    org.mockito.exceptions.base.MockitoException: 
    Cannot mock/spy class ...handlers.AHandler
    Mockito cannot mock/spy because :
     - final class
        at handlers.AHandlerTest$1.invoke(AHandlerTest.kt:76)
        at handlers.AHandlerTest$1.invoke(AHandlerTest.kt:17)
它还无法说明context.request不能为null

import ratpack.handling.Context

class AHandler : Handler {

 override fun handle(contex: Context) {
        when (contex.request.method) {
            HttpMethod.POST -> create(contex)
            else -> {
                contex.response.status(405)
                contex.render("Unsupported method. Supported methods are: POST")
            }
        }
 }
}
测试文件:


package handlers

import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.verify
import handlers.AHandler
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe
import ratpack.handling.Context

import org.mockito.Mockito
import ratpack.http.HttpMethod
import kotlin.test.assertEquals
import kotlin.test.assertFails


class AHandlerTest: Spek({


    val context = mock<Context>()

    val httpReq = mock<Context> {
        on { context.request.method }.doReturn(HttpMethod.DELETE)
    }


    describe("testing handler function") {
        it("it should fail when not given a post method") {


        }
    }
})


包处理程序
导入com.nhaarman.mockitokotlin2.doReturn
导入com.nhaarman.mockitokotlin2.mock
导入com.nhaarman.mockitokotlin2.verify
导入处理程序.AHandler
导入org.spekframework.spek2.Spek
导入org.spekframework.spek2.style.specification.description
导入ratpack.handling.Context
导入org.mockito.mockito
导入ratpack.http.HttpMethod
导入kotlin.test.assertEquals
导入kotlin.test.asserts失败
等级AHandlerTest:Spek({
val context=mock()
val httpReq=mock{
在{context.request.method}.doReturn(HttpMethod.DELETE)上
}
描述(“测试处理函数”){
它(“如果没有给出post方法,它应该失败”){
}
}
})

以下是帮助我通过考试的原因-

describe("testing handle function") {
  it("it should fail when not given a post method") {
            val aHandler = AHandler();
            val result = RequestFixture.handle(aHandler, Action {request ->
                request.method("DELETE")
            })
            result.status.code shouldEqual 405

        }
    }

之后它通过了测试

当你模拟
上下文
时,你是否指定它的
请求
返回的内容?当前模拟的上下文如下-val context=Mockito.mock(context::class.java);我在模拟我想要返回的http请求,我相信:val-httpReq=mock{on{context.request.method}.doReturn(HttpMethod.DELETE)}您的
AHandler
是最终的,所以您不能模拟它。另外,它看起来像是在测试一个andler,所以不应该模仿它。