我想实现类似这样的结构。
主类:
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/