mockk 을 java에서 써보려는 시도에 대한 기록

요약

kotlin 에서 인기를 얻고 있는 mockk test libary 를 java 에서 써보려고 시도한 내용을 남김


WHY

  • java 환경 유지 필요

  • kotlin compile은 너무 느려요

  • mockito vs mockk (Like!!!)

  • relaxed mocking 의 편리함 ( but 주의해서 사용 필요)


HOW

  • mockk wrapper 를 abstract kotlin class 로 생성 후 compile 된 library 형태로 사용

  • retrofit 등 kotlin code를 활용하는 라이브러리와 비슷한 느낌...


경과

  • 정확한 인자를 사용하면 every, verify 사용가능 ( any() 는 아직 대체 방법을 찾지 못함)

  • relaxed mock? yes

  • mock method chaining?

  • just runs support?

  • static method mocking?

  • verify exactly ?

  • every answers andThenAnswer ?


의견

  • 아직까지는 활용하기 어렵네..


example

MockkForJavaPocTest.java

@ExtendWith(MockKExtension.class)
class MockkForJavaPocTest extends MockKForJava {
  @InjectMockk 
  private Subject subject;
  @Mockk(relaxed = true)
  private SubComponent sub;
  @Test  
  void test() {
    // given
    givenK(() -> sub.call("hello"), "-mock-return");
    // when
    String result = subject.call("hello");
    // then
    assertThat(result).isEqualTo("hello");
    verifyK(() -> sub.call("hello-mock-return"));
  }  


  static class Subject {
    private final SubComponent sub;
    public Subject(SubComponent sub){ this.sub = sub; }
    public String call(String arg) { return arg + sub.subCall(arg); }
  }
  static class SubComponent {
    String subCall(String arg){ return arg; }
  }
}

implementation (trying)

MockKForJava.kt

open class MockKForJava {
  fun givenK(fn: ()-> Any, ret: Any) {
    every { fn() } returns ret
  }
  fun givenK(fn: ()-> Void) {
    justRun { fn() }
  }
  fun veirifyK(fn: ()-> Any) {
    verify{ fn() }
  }
}

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 9월 4일 오후 3:19

댓글 0