【问题标题】:Mockito cannot resolve a public static method of a classMockito 无法解析类的公共静态方法
【发布时间】:2021-10-14 10:12:04
【问题描述】:

我有一个名为 AppUtilComponent 类,其中包含一组 public static 方法:

@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....
    
}

上面编写的两个static 方法由GearApiUserDetailsService 类的loadUserByUsername 方法调用。为了测试GearApiUserDetailsService.loadUserByUsername,我想模拟对AppUtil 的这些static 方法的调用。这就是我的单元测试类现在的样子:

@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());
        }
    }
}

问题在于,虽然 getActiveProfiles 的模拟运行良好(经过测试),但 readResourceFileAsString 的模拟甚至在编译时都失败了,IntelliJ 报告说无法解决:

这两个方法都是publicstatic,唯一的区别是第二个接受一个参数。

This 2020 post 似乎建议确保pom 文件在版本3.5.13 中包含mockito-core 的依赖项。我已经包含了这个依赖,无效的缓存/重新启动,尝试重新运行整个 maven 构建生命周期,但显然由于上述错误它在编译时仍然失败。想法? (=

【问题讨论】:

    标签: spring mocking mockito junit4 mockstatic


    【解决方案1】:

    我能够通过very recent Baeldung entry 确定,当使用参数模拟静态方法时,必须使用函数接口MockedStatic.Verification 的实例,它可以是 lambda 表达式的目标。所以,改变这个:

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

    到:

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

    成功了。在必要的 24 小时后将此答案标记为已接受。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多