Android:尝试测试套接字

时间:2016-04-12 11:11:48

标签: java android unit-testing testing automated-tests

我试图在Android Java中测试套接字通信,但似乎无法进行模拟工作。

首先,使用Mockito,mock(Socket.class)会抛出异常java.lang.VerifyError

所以我把我的模拟编码如此:

public void testMyTest(){
    final ByteArrayOutputStream os = new ByteArrayOutputStream();
    final ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());

    try{
        byte[] buffer = new byte[6];
        os.write("poulet".getBytes());
        is.read(buffer, 0, 6);
        Log.w(LOG_TAG, "Read result:" + (new String(buffer, "UTF-8")));
    } catch(IOException e){}
}

但是,当我致电is时,os无法从os.write()读取。原始结果为[B@42204320,并且以字符串形式显示为������������。我尝试评论os.write(),但没有任何改变。

有谁知道如何链接输入流以从输出流中读取?

为了测试我刚刚调用的课程

final Socket mockedSocket1 = new Socket();
final Socket mockedSocket2 = new Socket();
when(mockedSocket1.getInputStream()).thenReturn(is);
when(mockedSocket2.getOutputStream()).thenReturn(os)

这样我的课程就可以获得我要测试的链接输出和输入流。

非常感谢!

1 个答案:

答案 0 :(得分:1)

is的缓冲区将始终为空。

这:ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());只创建一个带有空缓冲区的ByteArrayInputStream,当你向ByteArrayOutputStream写一些内容时,该缓冲区不会改变。

  
    

public byte [] toByteArray()

         

创建新分配的字节数组。它的大小是此输出流的当前大小,缓冲区的有效内容已复制到中。     ...

  

您可以做的是在向ByteArrayInputStream写一些内容后创建ByteArrayOutputStream,例如:

try (ByteArrayOutputStream os = new ByteArrayOutputStream();){
    byte[] buffer = new byte[6];
    os.write("poulet".getBytes("UTF-8"));
    try(ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());){
        is.read(buffer, 0, 6);
        System.out.println("Read result:|" + (new String(buffer, "UTF-8") + "|"));
    }
} catch (IOException e) {
}