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

标签 java 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());
   }

当我 stub write()read() 方法时,保存的值 mockData 不包含实际数据缓冲区。如何获取 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 和 stub write() (尝试将传递的参数保存在 mockData 字段中)和 read()(返回之前保存在 write 方法参数中的)方法。

我做错了什么?

最佳答案

Connection 的问题尽管如此,您需要更改使用第一个 Answer 的方式并利用thenAnswer()代替thenReturn()为您read()方法。基本上,您的测试代码没有看到 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;
}

请注意第一个 Answer 的更改write() 的实例方法。答案的类型指示返回类型。自 write()方法不返回任何内容,您的 Answer实例的类型应为 Answer<Void>你的answer()在哪里方法返回 null因为Void类型没有实例 - 只有 null可以转换到它。

其次,您的Answer read() 的实例现在存在,代替以前使用的 thenReturn() .

我希望这会有所帮助。如果需要的话,请告诉我更多问题。

关于java - Mockito:保存模拟参数并从另一个函数返回它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34760129/

相关文章:

java - 刷新 Activity 中的方法

java - JSTL 调用一个不是 setter 或 getter 的方法

java - Eclipse 在服务器上调试/运行

java - Mockito 非 stub 函数

Android 单元测试/Mockito : android. location.Location not mocked

java - 自定义百分比比例

java - 如何在 maven 中使用单个 groupId 和多个 artifactId?

android - 如何模拟应用程序类来单元测试 ViewModel

spring-boot - Java 单元测试给出 NullPointer 异常

java - 不能在 Spock 测试中使用 Mockito spy 类?