Mockito cannot resolve a public static method of a class

812 Views Asked by At

I have a Component class called AppUtil with a bunch of public static methods:

@Component
public class AppUtil {
    
    // Methods, fields...
    
    public static List<String> getActiveProfiles() {
        return newArrayList(appUtil.env.getActiveProfiles());
    }

    public static String readResourceFileAsString(String fileName) throws IOException {
        return IOUtils.toString(new FileReader(fileName));
    }
    
    // More methods....
    
}

The two static methods writen above are called by a method called loadUserByUsername of a class called GearApiUserDetailsService. In order to test GearApiUserDetailsService.loadUserByUsername, I want to mock the calls to these static methods of AppUtil. This is what my unit testing class looks like right now:

@RunWith(MockitoJUnitRunner.class)
public class GearApiUserDetailsServiceTest {

    @InjectMocks
    private GearApiUserDetailsService gearApiUserDetailsService;

    @Before
    public void setUp(){
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void testLoadUserByUsernameWithoutActiveProfiles(){
        try (MockedStatic<AppUtil> mockedStatic = Mockito.mockStatic(AppUtil.class)) {
            mockedStatic.when(AppUtil::getActiveProfiles).thenReturn(Collections.emptyList());
            mockedStatic.when(AppUtil::readResourceFileAsString).thenReturn("random string");
            final String apiKey = "someExampleAPIKey"; 
            UserDetails userDetails = gearApiUserDetailsService.loadUserByUsername(apiKey);
            assertEquals(apiKey, userDetails.getUsername());
        }
    }
}

The problem is that while the mock of getActiveProfiles works well (tested), the mock of readResourceFileAsString fails at compile time even, with IntelliJ reporting that it can't resolve it:

enter image description here

The methods are both public and static, with the only difference being that the second one takes an argument.

This 2020 post seems to suggest ensuring that the pom file contains a dependency of mockito-core at version 3.5.13. I have included this dependency, invalidated caches / restarted, tried to re-run entire maven build lifecycle, but obviously it still fails at compile time because of the aforementioned error. Ideas? (=

1

There are 1 best solutions below

0
On

I was able to determine, through a very recent Baeldung entry, that when one mocks static methods with arguments, one has to use an instance of the functional interface MockedStatic.Verification, which can be the target of a lambda expression. So, changing this:

mockedStatic.when(AppUtil::readResourceFileAsString).thenReturn("random string");

to:

mockedStatic.when(() -> AppUtil.readResourceFileAsString(anyString())).thenReturn("random string");

did the trick. Marking this answer accepted after necessary 24 hour period.