package ltd.lulz.service import io.mockk.every import io.mockk.mockk import io.mockk.slot import io.mockk.verify import java.math.BigDecimal import java.util.UUID import ltd.lulz.model.AccountEntity import ltd.lulz.repository.AccountRepository import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import reactor.core.publisher.Mono import reactor.test.StepVerifier @Suppress("ReactiveStreamsUnusedPublisher", "MayBeConstant") class AccountServiceTest { companion object { val name: String = "some name" val amount: BigDecimal = BigDecimal.valueOf(0.01) val uuid: UUID = UUID.fromString("00000000-0000-0000-0000-000000000000") } private var repository: AccountRepository = mockk() private lateinit var service: AccountService @BeforeEach fun setUp() { service = AccountService(repository) } @Test fun `create account`() { // given val entity = AccountEntity(name = name, amount = amount) val capture = slot() every { repository.save(capture(capture)) } answers { Mono.just(capture.captured.copy(id = uuid)) } // when stepped StepVerifier.create(service.create(entity)) .assertNext { result -> assertThat(result.id).isEqualTo(uuid) assertThat(result.name).isEqualTo(name) assertThat(result.amount).isEqualTo(amount) } .verifyComplete() verify { repository.save(any()) } } }