Kotlin + Mockito + Spring-boot - PullRequest
0 голосов
/ 30 мая 2020

Я изучаю Kotlin с помощью Spring Boot, и я пытаюсь использовать 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é"))
    }
}

И я пытаюсь чтобы издеваться над моим Дао в интеграционном тесте:

@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 () [0]. идентификация)

Как я могу издеваться над этим Дао в таком интеграционном тесте?

1 Ответ

1 голос
/ 18 июня 2020

К сожалению, у меня нет ответа на проблему с Mockito, потому что я давно отключился от Mockito.

Если Mockito не является обязательным, я рекомендую использовать MockK (https://github.com/mockk/mockk) из моего опыта Spring Boot + Kotlin. Если вам также нужны инъекционные имитирующие Beans, вы также можете добавить SpringMockK (https://github.com/Ninja-Squad/springmockk).

Поскольку ваш «PersonDaoResponse» создается в классе PersonImplementation, вы можете использовать что-то вроде это с MockK:

every { anyConstructed<PersonDaoResponse>().findAll() } returns listOf(PersonDaoResponse(999L, "Zé"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...