java - 使用 PowerMock 时出现 ExceptionInInitializerError

标签 java android junit mockito powermockito

我有一个如下所示的测试类。需要在HmUtils.class内部模拟一个静态方法,

@RunWith(PowerMockRunner.class)
@PrepareForTest({Environment.class, HmUtils.class})
public class MyUtilTest {
@Mock
Context mockedContext;
@Before
public void initialSetup()
{
    System.out.println("initSetup Executed:");
    mockedContext = PowerMockito.mock(Context.class);
    PowerMockito.mockStatic(Environment.class);
    PowerMockito.mockStatic(HmUtils.class);
}
@Test
public void DeviceTest() throws Exception
{
    System.out.println("DeviceTest Executed:");
    when(Environment.getExternalStorageDirectory()).thenReturn(new File("testFile"));
    when(Environment.getExternalStorageDirectory()
            .getAbsolutePath()).thenReturn(anyString());
    HmUtils.setCurrentBTAddress(null);
}

在 HmUtils.class 中,我有一个像这样的静态值(第 332 行)

public static final String TEST_FOLDER = Environment.getExternalStorageDirectory()
        .getAbsolutePath();

这会抛出一个错误,例如“环境”getmethod 未被模拟。所以我模拟了环境类并尝试返回 getExternalStorageDirectory() 、 getAbsolutePath() 的值,如上所述。但仍然显示错误

java.lang.ExceptionInInitializerError
at sun.reflect.GeneratedSerializationConstructorAccessor12.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
Caused by: java.lang.NullPointerException
at com.package.android.app.mymanager.util.HmUtils.<clinit>(HmUtils.java:332)

最佳答案

LogUtils.class中,我在这一行中遇到错误

  public class LogUtils
 {
    private static final String TEST_FILE_FOLDER = Environment.getExternalStorageDirectory()
        .getAbsolutePath();
 }  

LogUtilsTest.Class中,我通过下面的代码 fragment 解决了环境异常初始化错误

 @RunWith(PowerMockRunner.class)
 @PrepareForTest({Environment.class})
 public class LogUtilsTest {

private File file;

@Before
public void initialSetup() {
    PowerMockito.mockStatic(Environment.class);
    file = mock(File.class);
    when(Environment.getExternalStorageDirectory()).thenReturn(file);
    when(file.getAbsolutePath()).thenReturn("abc"); 
                    ( OR )
    //when(file.getAbsolutePath()).thenReturn(Mockito.anyString()); 
}

@Test
public void log_d() {
    LogUtils.log_d("tag", "message");
 }
}

关于java - 使用 PowerMock 时出现 ExceptionInInitializerError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46600068/

相关文章:

java - Hamcrest 的多个正确结果(是否有或匹配器?)

java - 自签名证书 : DNSName components must begin with a letter

Java从url字符串中提取子字符串

android - android 中支持的最大 Activity 数?

java - 为什么此测试 junit 测试返回 400?

java - Apache kafka 嵌入式 kafka junit 测试 - 当我运行单元测试时启动应用程序

java - 托管一个基于java的服务器

Java编码效率。 JRadioButton 对象和 ItemListener 交互

android - Firestore 实时更新不适用于 recyclerview

android - 即使设备在信标附近保持静止,应用程序也会在 didEnterRegion() 和 didExitRegion() 之间循环