TLDR; Wrap when
in backticks to make it work.
1
2
3
// stubbing Unirest and returning a mock response
`when`(Unirest.post(Mockito.anyString()))
.thenReturn(httpRequestWithBody)
PowerMock is an extremely
useful library for testing JVM applications. It makes mocking static
members simple
and plugs right into Mockito.
I’ve used this library quite a bit in the past for pure Java projects and saw no reason to use it
for testing a Kotlin project targetting the JVM.
Most of the setup is identical to what the Java test class would look like. However, Kotlin uses adds
some reserved words on top of those used by Java.
In particular, the when
expression is generally an improvement on switch
. See the below example.
1
2
3
4
5
6
val numberText = when(integerValue) {
0 -> "It's zero"
in 1..10 -> "It's single Digits"
in 10..20 -> "It's in the teens"
else -> "I'm not making a comprehensive set"
}
The match operator has three major advantages over switch
. It can accept expressions (in 1..10
) as well as single values (0
).
It requires the matches to be exhaustive (else
). And there is no risk of fallthrough (no break
).
Unfortunately, this useful operator does interfere with the PowerMock library, which implements a when
method that can be used for stubbing methods.
Using this method as you would in Java results in a compilation error.
Luckily, Kotlin provides a facility for working around this issue (as well as any other reserved work conflicts).
Wrapping the when
in backticks (`) will allow the PowerMock method to be called as expected.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RunWith(PowerMockRunner::class)
@PrepareForTest(Unirest::class)
class LoginServiceTest {
/**
* Create Mocks for use in stubs and elsewhere
*/
@Before
fun setup() {
mockStatic(Unirest::class.java)
`when`(Unirest.post(Mockito.anyString()))
.thenReturn(httpRequestWithBody)
}
/**
* Post method is mocked for remaining tests
*/
}
Thanks for Reading!