我想实现这样的结构。
主类:
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 存根机制。