I have MyClass with
- public
doSomething- method to be tested - protected static
getYourStaticBool- method to be mocked, containsSystem.getenvmethod which cannot be mocked - static boolean
MY_STATIC_BOOL- it has to be static and the value is provided bygetYourStaticBool
MyClass:
public class MyClass {
private static boolean MY_STATIC_BOOL = getYouStaticBool();
public void doSomething() {
if (MY_STATIC_BOOL) {
//....
}
}
protected static boolean getYourStaticBool() {
return Optional.ofNullable(System.getenv("foo"))
.map(Boolean::parseBoolean)
.orElse(false);
}
}
Now I want to doSomething so I have to mock getYourStaticBool to set MY_STATIC_BOOL on true.
@ExtendWith(MockitoExtension.class)
public class MyClassTest {
private MyClass myClass = new MyClass();
@BeforeAll
void static init() {
try (MockedStatic<MyClass> myClass = Mockito.mockStatic(MyClass.class)) {
myClass.when(() -> MyClass.getYourStaticBool())
.thenReturn(true);
}
}
@Test
void shouldDoSth() {
myClass.doSomething();
}
}
Unfortunately calling myClass.doSomething() reveals that MY_STATIC_BOOL is false. So the real getYourStaticBool is called, not the mocked one.
Maybe should I use spy and mock static getYourStaticBool? I can't use PowerMockito.