簡體   English   中英

Mockito:保存模擬參數並從另一個函數返回它

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM