如何在junit测试中使用android.os.Process?

时间:2018-08-06 14:10:48

标签: android unit-testing junit

我正在尝试实现一个使用android.os.Process.myPid的简单测试(实际上,我有一个使用myPid的大类,但是为了避免发布大型源代码,我简化了所有内容):

import org.junit.Test;
import static org.junit.Assert.assertTrue;

public class ProcessTest {
    @Test
    public void testTest() {
        assertTrue(true);
    }

    @Test
    public void testPid() {
        int pid = android.os.Process.myPid();
        //assertTrue(true);
    }
}

第一次测试通过,但是第二次失败,并显示以下错误消息:

java.lang.UnsatisfiedLinkError: android.os.Process.myPid()I

怎么了?如何测试使用android.os.Process的类?

2 个答案:

答案 0 :(得分:1)

您不能在单元测试中做到这一点。您无法在单元测试中访问Android OS软件包。你可以嘲笑他们!您需要一个进程ID,但是没有操作系统(除了正在开发的计算机之外)。

答案 1 :(得分:0)

一段时间后,我找到了解决问题的方法-仪器测试。是的,正如Krzysztof Kubicki指出的那样,它不能在单元测试中完成。但是,尽管有可能模拟事物,但在实际情况下却很难。我可以通过简单的测试来模拟pid,但是真正的东西是Tozny编写的AesCbcWithIntegrity,带有所有的花哨功能,包括以下内容:

int bytesRead = (Integer) Class
    .forName("org.apache.harmony.xnet.provider.jsse.NativeCrypto")
     .getMethod("RAND_load_file", String.class, long.class)
     .invoke(null, "/dev/urandom", 1024);

这有点很难模拟。因此,我没有模拟,而是创建了工具测试并在模拟器上运行了测试。

那不费吹灰之力就解决了我的问题。是的,与常规的单元测试相比,仪器测试要慢一些,但至少可以。