javakotlinstaticmockk

How to mock Java static block


I have a following Java class in a 3rd party library:

public final class SomeFactory {
  public static native someMethod1()
  public static native someMethod2()

  private SomeFactory() {
  }

  static {
    System.loadLibrary("some_lib");
  }
}

And this crashes my tests, because loading that some_lib fails.

java.lang.UnsatisfiedLinkError: no some_lib in java.library.path: /usr/java/packages/lib:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib

So how can I mock this class? I'm suing MockK and Kotest.

I've tried different combinations of just mockk(), mockkStatic(), mockkConstructor() and others, but nothing works. I've even tried mockkStatic(System::class), but it seems like it broke the JVM completely.


Solution

  • What I did was create a new object, that wraps the original one:

    object SomeWrapper {
      fun someMethod1() = SomeFactory.someMethod1()
    }
    

    and then in MockK, just mock the object:

    mockkObject(SomeWrapper)
    every { SomeWrapper.method1() } returns mockk()