Android:使用从InstrumentationTestCase

时间:2015-06-12 10:30:42

标签: java android android-5.0-lollipop android-uiautomator

我为shellCommand子类编写了一个通用的InstrumentationTestCase函数。对executeShellCommand的调用有效(命令已执行),但我对返回的ParcelFileDescriptor做错了,因为它似乎返回了垃圾。这是我的通用shellCommand函数 -

public String shellCommand(String str)
{
    UiAutomation uia = getInstrumentation().getUiAutomation();
    ParcelFileDescriptor pfd;
    FileDescriptor fd;
    InputStream is;
    byte[] buf = new byte[1024];
    String outputString = null;

    try
    {
        pfd = uia.executeShellCommand(str);
        fd = pfd.getFileDescriptor();
        is = new BufferedInputStream(new FileInputStream(fd));
        is.read(buf, 0, buf.length);
        outputString = buf.toString();
        Log.d(TAG, String.format("shellCommand: buf '%s'",outputString));
        is.close();
    }
    catch(IOException ioe)
    {
        Log.d(TAG, "shellCommand: failed to close fd");
    }
    return outputString;
}

这是一个显示我称之为的片段 -

String output = shellCommand("ls -al /");
Log.d(TAG, String.format("root dir = {%s}", output)); 

我希望收到命令的输出字符串(在本例中,是顶级目录列表)。相反,我看到以下日志 -

  

shellCommand:buf'[B @ 1391fd8d'

我对Java不太满意,我只是用它来编写一些自动化测试。我显然对ParcelFileDescriptorBufferedInputStream做错了,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

toString()方法实际上并不将字节数组的内容转换为String。它返回“对象的字符串表示”。在这种情况下,'[B @ 1391fd8d'表示“哈希码为1391fd8d的字节数组” - 不是很有用吗?

您可以使用新的String(byte[])构造函数将byte []转换为String。

然而,使用BufferedReader.readLine()直接从每行输出中获取String可能更容易。