Mockito:保存模拟参数并从另一个函数返回



我想实现这样的结构。

主类:

public class Connection {
    byte[] read() throws Exception 
    {
      // read some data
      return data;
    }
    void write(byte[] data) throws Exception 
    {
      // write some data
    }
}

测试类:

public class ConnectionTest 
{
    private static byte[] mockData;
    private Connection connection;
    public Connection createMockConnection() {
        Connection mockConnection = mock(Connection.class);
        try {
            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    mockData = (byte[]) invocation.getArguments()[0];
                    return mockData;
                }
            }).when(mockConnection).write(any(byte[].class));
            when(mockConnection.read()).thenReturn(mockData);
        } catch (Exception e) {}
        return mockConnection;
    }
    @Before
    public void createConnection() throws Exception {
        connection = createMockConnection();
    }
    @After
    public void destroyConnection() throws Exception {
        connection = null;
    }
    @Test
    public void testCallbackConnection() throws Exception {
        byte[] data = new byte[] {1,2,3,4};
        connection.write(data);
        assertArrayEquals(data, connection.read());
   }

保存的值mockData不包含实际的数据缓冲区,当我存根write()read()方法。如何在函数中传递实际值testCallbackConnection()

谢谢!

更新:

我在createMockConnection()函数中模拟write()和read()方法:

doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        mockData = (byte[]) invocation.getArguments()[0];
        return mockData;
    }
}).when(mockConnection).write(any(byte[].
when(mockConnection.read()).thenReturn(mockData);

我有真正的连接,通过回调写入/读取函数进行了测试,并且工作正常。然后我想编写单元测试,以防我无法访问真正的连接。在这种情况下,我创建了mockConnection和存根write()(尝试将传递的 arg 保存在mockData字段中)和read()(返回之前保存在写入方法 arg 中)方法。

我做错了什么?

尽管存在

Connection问题,但您需要更改使用第一个Answer的方式,并使用thenAnswer()代替read()方法的thenReturn()。基本上,您的测试代码看不到对mockData引用的更新。

createMockConnection()的新代码是:

public Connection createMockConnection() {
    Connection mockConnection = mock(Connection.class);
    try {
        doAnswer(new Answer<Void>() {
            @Override
            public Void answer(InvocationOnMock invocation) throws Throwable {
                mockData = (byte[]) invocation.getArguments()[0];
                return null;
            }
        }).when(mockConnection).write(any(byte[].class));
        when(mockConnection.read()).thenAnswer(new Answer<byte[]>() {
            @Override
            public byte[] answer(InvocationOnMock invocation) throws Throwable {
                return mockData;
            }
        });
    } catch (Exception e) {}
    return mockConnection;
}

请注意对 write() 方法的第一个Answer实例的更改。答案的类型指示返回类型。由于 write() 方法不返回任何内容,因此Answer实例应属于类型 Answer<Void>,其中 answer() 方法返回 null,因为Void类型没有实例 - 只能强制转换为null

其次,您现在存在read()Answer实例,而不是以前使用 thenReturn()

我希望这有所帮助。如果需要,请向我提出进一步的问题。

替换

when(mockConnection.read()).thenReturn(mockData);

    when(mockConnection.read()).thenAnswer(new Answer<byte[]>() {
        @Override
        public byte[] answer(InvocationOnMock invocation) throws Throwable {
            return mockData;
        }
    });

现在mockData包含有效值,该值保存在write()方法中,并且testCallbackConnection()传递而没有错误。

感谢您帮助理解 Mockito 存根机制。

相关内容

  • 没有找到相关文章

最新更新