我想實現類似這種結構的東西。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()
函數的實際值?
謝謝!
UPDATE:
我嘲笑寫(),讀()在createMockConnection方法()函數:
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()
(嘗試保存傳遞參數mockData
字段)和read()
(返回先前保存在寫入方法arg中)的方法。
我在做什麼錯?
你真的模擬了'write()'和'read()'方法嗎?我沒有看到這個地方。另外,你能否清楚地告訴我們你想要測試的是什麼?如果要測試實際連接,請設置集成測試。如果你想單元測試使用連接的代碼,然後模擬連接以表現你想要的方式。 –
當您調用'thenReturn(mockData)'時,mockData仍爲空,因爲沒有人在連接上調用write(),所以答案尚未執行。您需要另一個閱讀答案()。但我真的不明白你想在這裏做什麼。您正在測試Mockito,而不是您的代碼。 –
我看到,當我調用存根read()方法時,mockData仍爲null。但我認爲存根方法調用只有當我嘗試調用真正的方法,即我的工作邏輯: 調用真正的方法connection.write(數據)調用存根方法mockConnection.write(數據),然後我保存傳遞的arg(數據)字段mockData。在此之後,我調用真正的方法connection.read(),調用存根方法mockConnection.read(),並返回mockData字段作爲結果。 – Andrew