如何在 kotlin 上的单元测试中访问受保护的方法

问题描述 投票:0回答:1

有没有办法获取内部受保护的值并在 kotlin 单元测试中访问它,下面是我的 doPost 受保护方法,我尝试使用反射,但它不起作用,遵循此示例 https://stackoverflow.com/a/41695398/6377156

myimage

@Mock
internal lateinit var jobServlet:myHttpServlet

private val mockContext = mockk<Context>(relaxed = true)
private val mockHttpRequest = mockk<HttpServletRequest>(relaxed = true)
private val mockHttpResponse = mockk<HttpServletResponse>(relaxed = true)

class JobDescriptorServletsTest {

    @Before
    fun setup(){
        mockkStatic(Context::class)
        jobServlet =  myHttpServlet(mockContext)

    }

    @Test
    fun verify_Instance(){
        assertNotNull(jobServlet)
    }
    @Test
    fun doPostTest(){
        val protectedMethod = myHttpServlet::class.java.getDeclaredMethod("doPost")
        protectedMethod.isAccessible = true
        protectedMethod.invoke(jobServlet.doPost(mockHttpRequest, mockHttpResponse))


    }
}
android kotlin unit-testing methods protected
1个回答
0
投票

你可以使用Kotlin的反射来代替Java


    private val mapper = Mappers.getMapper(MyMapper::class.java)
    private val propertyMapper = Mappers.getMapper(PropertyMapper::class.java)

    private val service = EmployeeService(repository, mapper)

 @Test
 fun test() {
  // Arrange
        val property = mapper::class
            .memberProperties
            .first { it.javaField?.type == PropertyMapper::class.java }
            .also { it.isAccessible = true }
        if (property is KMutableProperty<*>) {
            property.setter.call(mapper, propertyMapper)
        }
        initializeContext()


        // Act & Assert
        val response = assertDoesNotThrow { service.someMethod() }

        assertAll(
            { Assertions.assertEquals(HttpStatus.OK, response.statusCode) },
            { assertNotNull(response.body?.data) },
            { response.body?.success?.let(Assertions::assertTrue) },
        )
}
© www.soinside.com 2019 - 2024. All rights reserved.