1

我有一个用一堆方法Component调用的类:AppUtilpublic 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方法是由loadUserByUsername一个类的调用方法调用的GearApiUserDetailsService。为了测试GearApiUserDetailsService.loadUserByUsername,我想模拟对这些static方法的调用AppUtil。这就是我的单元测试类现在的样子:

@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 报告它无法解决它:

在此处输入图像描述

这两个方法都是publicand static,唯一的区别是第二个方法带有一个参数。

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

4

1 回答 1

1

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

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

至:

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

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

于 2021-08-11T16:37:56.367 回答