mockito / mockito-kotlin

Using Mockito with Kotlin
MIT License
3.11k stars 201 forks source link

Verifying Setter #365

Closed HzKrym closed 11 months ago

HzKrym commented 4 years ago

Is it possible to do this?

interface Repository {
  fun setFoo(value)
  fun getFoo()
}
...
class Intercator (repository: Repository) {
  fun setFoo(value) {
    repository.setFoo(value)
  }
  fun getFoo() {
    return repository.getFoo()
  }
}
...
@Test
@Parameters(value = ["foo", "bar"])
fun testSetter(expectedResult: String) {
  val repo = mock<Repository>()
  val interactor = Interactor(repo)

  whenever(repo.setFoo(expectedResult)).then {
    whenever(repo.getFoo()).thenReturn(expectedResult)
  }

  val result = interactor.setFoo(expectedResult)
  assertEquals(result, expectedResult)
}
bohsen commented 4 years ago

Is it possible to do this?

No, because of val result = interactor.setFoo(expectedResult) - setFoo() doesn't return anything. And to be honest you shouldn't write tests like this IMHO. This design is (sorry to say this) a bit strange. Do you have a more concrete example? If I were to verify a setter in this simple case I would just set the value and assert against it. No need to mock the Repository. Just create an anonymous object and a fake implementation of it:

@Parameters(value = ["foo", "bar"])
fun testSetter(expectedResult: String) {
  val repo = object : Repository {
     var fooValue: <WhateverObjectThisShouldBe>
     override fun setFoo(value) {  fooValue = value  }
     override fun getFoo() = fooValue
 }
  val interactor = Interactor(repo)

  interactor.setFoo(expectedResult)
  assertEquals(interactor.getFoo(), expectedResult)
}