Issue
I am writing a Unit test for a class that uses android.util.Base64
and I get this error:
java.lang.RuntimeException: Method encode in android.util.Base64 not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.util.Base64.encode(Base64.java)
This is the code using the encode()
method:
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// [write some data to the stream]
byte[] base64Bytes = Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
Now I understand that I can't use Android library classes in my Unit tests. But how do I correctly mock Base64
so I can write a correct Unit test for my class?
Solution
Based on the comments by Nkosi and Christopher, I have found a solution. I used PowerMock to mock the static methods of Base64
:
PowerMockito.mockStatic(Base64.class);
when(Base64.encode(any(), anyInt())).thenAnswer(invocation -> java.util.Base64.getEncoder().encode((byte[]) invocation.getArguments()[0]));
when(Base64.decode(anyString(), anyInt())).thenAnswer(invocation -> java.util.Base64.getMimeDecoder().decode((String) invocation.getArguments()[0]));
And in my build.gradle
I had to add:
testImplementation "org.powermock:powermock-module-junit4:1.7.4"
testImplementation "org.powermock:powermock-api-mockito2:1.7.4"
Note that not every version of Powermock works with every version of Mockito. The version I used here is supposed to work with Mockito 2.8.0-2.8.9
, and I have no issues. However, support for Mockito 2 is still experimental. There is a table detailing the compatible versions on the project's wiki.
Answered By - O.O.Balance