【发布时间】:2021-10-14 10:12:04
【问题描述】:
我有一个名为 AppUtil 的 Component 类,其中包含一组 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 报告说无法解决:
这两个方法都是public 和static,唯一的区别是第二个接受一个参数。
This 2020 post 似乎建议确保pom 文件在版本3.5.13 中包含mockito-core 的依赖项。我已经包含了这个依赖,无效的缓存/重新启动,尝试重新运行整个 maven 构建生命周期,但显然由于上述错误它在编译时仍然失败。想法? (=
【问题讨论】:
标签: spring mocking mockito junit4 mockstatic