[英]Mockito: how to return the argument, which the mock method was called with, as response?
[英]Mockito: save mock argument and return it from another function
我想實現類似這種構造的東西。
主班:
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());
}
當我存入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
和存根write()
(嘗試將傳遞的arg保存在mockData
字段中)和read()
(返回先前保存在write方法arg中的方法)方法。
我究竟做錯了什么?
更換
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存根機制的幫助。
盡管存在Connection
問題,您仍需要更改使用第一個Answer
,並使用thenAnswer()
代替read()
方法的thenReturn()
。 基本上,您的測試代碼看不到對mockData
引用的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()
的先前用法。
希望對您有所幫助。 如果需要,請給我進一步的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.