首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin + Mockito + Spring-boot

Kotlin + Mockito + Spring-boot
EN

Stack Overflow用户
提问于 2020-05-30 10:44:24
回答 1查看 723关注 0票数 0

我正在使用Spring Boot学习Kotlin,并且我正在尝试使用Serenity作为报告。但是我对Mockito有一些问题,因为我不能模拟我代码的最后一部分。

这就是我的情况:

代码语言:javascript
复制
@RestController
@RequestMapping("/person")
class PersonController {

    @Autowired
    private lateinit var personUseCase : PersonUseCase


    @GetMapping("/all")
    fun findAllPeople(): DataModelResponse<List<PersonDataModelResponse>> {
        return DataModelResponse(
                PersonDataModelResponseMapper.transform(personUseCase.findAll()))
    }

}
代码语言:javascript
复制
@Component
class PersonUseCase {

    fun findAll(): List<PersonEntity> {
        val personImpl : Person = PersonImplementation()
        return personImpl.findAll()
    }
}
代码语言:javascript
复制
class PersonImplementation : Person {

    private val personDaoResponse :  PersonDaoResponse = PersonDaoResponse()

    override fun findAll(): List<PersonEntity> {

        val listPeopleDao = personDaoResponse.findAll()

        return PersonDaoMapper.transform(listPeopleDao)
    }

}
代码语言:javascript
复制
internal class PersonDaoResponse (
        val identification: Long = 0,
        val personName: String = "") {

    fun findAll(): List<PersonDaoResponse> {
        return listOf(PersonDaoResponse(1, "José"))
    }
}

我正在尝试在集成测试中模拟我的Dao:

代码语言:javascript
复制
@RunWith(SerenityRunner::class)
@WithTag("Integration")
@AutoConfigureMockMvc
@WebMvcTest
class PersonControllerTest {

    @InjectMocks
    private lateinit var personController : PersonController

    @InjectMocks
    private lateinit var personImplementation : PersonImplementation

    @SpyBean
    private lateinit var personUseCase : PersonUseCase

    @Spy
    private val personDaoResponse = PersonDaoResponse()

    @Autowired
    private lateinit var webApplicationContext: WebApplicationContext

    @Autowired
    private lateinit var mockMvc: MockMvc

    @Rule @JvmField
    var springMethodIntegration = SpringIntegrationMethodRule()

    @Before
    fun init() {
        MockitoAnnotations.initMocks(this)
        reset(personDaoResponse)

        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build()
        this.mockMvc = MockMvcBuilders.standaloneSetup(personController).setMessageConverters(MappingJackson2HttpMessageConverter()).build()
    }

    @Test
    fun `integration success`() {
        doReturn(listOf(PersonDaoResponse(999L, "Zé")))
                .`when`(this.personDaoResponse).findAll()
        val result = this.personController.findAllPeople()
        assertNotNull(result)
        assertEquals(999L, result.data[0].personId)
        assertEquals("Zé", result.data[0].name)
    }

}

如果我尝试调用模拟方法,我知道这个模拟方法是有效的: assertEquals(999L,this.personDaoResponse.findAll().identification)

我如何在这样的集成测试中模拟这个Dao呢?

EN

回答 1

Stack Overflow用户

发布于 2020-06-18 05:59:57

不幸的是,我没有Mockito问题的答案,因为我已经离开Mockito很久了。

如果Mockito不是必须的,我建议使用我的Spring Boot + Kotlin经验中的MockK (https://github.com/mockk/mockk)。如果您还需要可注入的模拟Beans,也可以添加SpringMockK (https://github.com/Ninja-Squad/springmockk)。

因为您的"PersonDaoResponse“是在PersonImplementation类中构造的,所以您可以在MockK中使用类似以下内容:

代码语言:javascript
复制
every { anyConstructed<PersonDaoResponse>().findAll() } returns listOf(PersonDaoResponse(999L, "Zé"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62097181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档