我正在使用Spring Boot学习Kotlin,并且我正在尝试使用Serenity作为报告。但是我对Mockito有一些问题,因为我不能模拟我代码的最后一部分。
这就是我的情况:
@RestController
@RequestMapping("/person")
class PersonController {
@Autowired
private lateinit var personUseCase : PersonUseCase
@GetMapping("/all")
fun findAllPeople(): DataModelResponse<List<PersonDataModelResponse>> {
return DataModelResponse(
PersonDataModelResponseMapper.transform(personUseCase.findAll()))
}
}@Component
class PersonUseCase {
fun findAll(): List<PersonEntity> {
val personImpl : Person = PersonImplementation()
return personImpl.findAll()
}
}class PersonImplementation : Person {
private val personDaoResponse : PersonDaoResponse = PersonDaoResponse()
override fun findAll(): List<PersonEntity> {
val listPeopleDao = personDaoResponse.findAll()
return PersonDaoMapper.transform(listPeopleDao)
}
}internal class PersonDaoResponse (
val identification: Long = 0,
val personName: String = "") {
fun findAll(): List<PersonDaoResponse> {
return listOf(PersonDaoResponse(1, "José"))
}
}我正在尝试在集成测试中模拟我的Dao:
@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呢?
发布于 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中使用类似以下内容:
every { anyConstructed<PersonDaoResponse>().findAll() } returns listOf(PersonDaoResponse(999L, "Zé"))https://stackoverflow.com/questions/62097181
复制相似问题