Java Powermockito到mock环境静态方法

Java Powermockito到mock环境静态方法,java,android,unit-testing,powermockito,Java,Android,Unit Testing,Powermockito,我不熟悉使用Powermockito来模拟静态方法。我的第一次尝试是模拟环境类上的调用。我有一个样本测试,可以举例说明我的问题,如下面的测试课所示。考试不及格,所以我正在寻求帮助 @RunWith(PowerMockRunner.class) @PrepareForTest({Environment.class}) public class StorageUtilsTest { @Test @Config(sdk = 22) public void myTest() {

我不熟悉使用
Powermockito
来模拟静态方法。我的第一次尝试是模拟
环境
类上的调用。我有一个样本测试,可以举例说明我的问题,如下面的测试课所示。考试不及格,所以我正在寻求帮助

@RunWith(PowerMockRunner.class)
@PrepareForTest({Environment.class})
public class StorageUtilsTest {
    @Test
    @Config(sdk = 22)
    public void myTest() {
        PowerMockito.mockStatic(Environment.class);
        File mockStorageDirectoryFile = Mockito.mock(File.class);
        PowerMockito.when(Environment.getExternalStorageState()).thenReturn(Environment.MEDIA_MOUNTED);
        PowerMockito.when(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)).thenReturn(mockStorageDirectoryFile)`;
    }
}
我试图模拟对
环境.getExternalStoragePublicDirectory
的静态方法调用,它返回null,并给出一个异常
org.mockito.exceptions.misusing.NotAMockException:参数应该是模拟的,但是是:class java.lang.class。
静态方法调用返回null。我知道方法调用在
sdk=29
中已被弃用,因此我已将测试配置为使用
sdk=22
运行,但它仍然不起作用。因此,为了理解发生了什么,我添加了对
getExternalStorageState
方法的调用,如上所示。我在这个方法上也得到了一个空的返回值。我的理解是这个方法应该返回一些东西,但它也返回null。我正在为
sdk=22
配置测试,因为我正在build.gradle中设置
targetSdkVersion 29


我真的很困惑为什么我不能在Environment类上模拟静态方法。有人能帮我理解我做错了什么吗?

模仿静态方法几乎总是设计问题的标志。相反,你应该有一些
接口StorageManager
,这是你互动的焦点,你可以正常地模仿。我同意你的看法。对不起,我不清楚。我正在模拟的静态方法是环境方法,而不是我的方法。我的类使用了我正在模仿的环境方法。我理解这一点。我是说你应该重新设计你的API,这样它就不会对
环境
有隐藏的依赖(例如,你应该传递变量)。这实际上是Android API中的一个严重缺陷,但不幸的是,它已经存在了。好吧,除了重新编写我的API,除了Android API中的严重缺陷之外,有人能提供一些反馈,说明我在模拟标准安卓类时犯了什么错误吗?模拟静态方法几乎总是设计问题的一个标志。相反,你应该有一些
接口StorageManager
,这是你互动的焦点,你可以正常地模仿。我同意你的看法。对不起,我不清楚。我正在模拟的静态方法是环境方法,而不是我的方法。我的类使用了我正在模仿的环境方法。我理解这一点。我是说你应该重新设计你的API,这样它就不会对
环境
有隐藏的依赖(例如,你应该传递变量)。这实际上是Android API中的一个严重缺陷,但不幸的是,它已经过时了。好吧,除了重新编写我的API之外,除了Android API中的严重缺陷之外,有人能提供一些反馈,说明我在模仿标准安卓类时做错了什么吗?