Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito:保存mock参数并从另一个函数返回它_Java_Mockito - Fatal编程技术网

Java Mockito:保存mock参数并从另一个函数返回它

Java Mockito:保存mock参数并从另一个函数返回它,java,mockito,Java,Mockito,我想实现这样的结构 主要类别: public class Connection { byte[] read() throws Exception { // read some data return data; } void write(byte[] data) throws Exception { // write some data } } 测试等级: public class Connection

我想实现这样的结构

主要类别:

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()
(尝试在
mockData
字段中保存传递的参数)和
read()
(返回先前保存在write方法arg中的参数)方法

我做错了什么?

替换

when(mockConnection.read()).thenReturn(mockData);

when(mockConnection.read()).thenAnswer(new-Answer()){
@凌驾
公共字节[]应答(调用锁调用)抛出可丢弃{
返回模拟数据;
}
});
现在
mockData
包含有效值,该值保存在
write()
方法和
testCallbackConnection()
中,无错误传递

感谢您帮助理解Mockito存根机制。

替换

when(mockConnection.read()).thenReturn(mockData);

when(mockConnection.read()).thenAnswer(new-Answer()){
@凌驾
公共字节[]应答(调用锁调用)抛出可丢弃{
返回模拟数据;
}
});
现在
mockData
包含有效值,该值保存在
write()
方法和
testCallbackConnection()
中,无错误传递


感谢您帮助理解Mockito存根机制。

尽管
连接存在问题
,但您需要更改第一个
答案的使用方式,并使用
然后回答()
代替
然后返回()
来执行
读取()
方法。基本上,测试代码没有看到
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;
}
公共连接createMockConnection(){
连接mockConnection=mock(Connection.class);
试一试{
doAnswer(新答案){
@凌驾
公共Void应答(invocationmock调用)抛出可丢弃的{
mockData=(字节[])调用.getArguments()[0];
返回null;
}
}).when(mockConnection).write(任意(byte[].class));
当(mockConnection.read())。然后回答(new Answer()){
@凌驾
公共字节[]应答(调用锁调用)抛出可丢弃{
返回模拟数据;
}
});
}捕获(例外e){}
返回模拟连接;
}
注意对
write()
方法的第一个
Answer
实例的更改。答案的类型表示返回类型。由于
write()
方法不返回任何内容,因此
Answer
实例应为
Answer
类型,其中
Answer()
方法返回
null
,因为
Void
类型没有实例-只能对其强制转换
null

其次,
read()
Answer
实例现在已经存在,取代了先前使用的
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;
}
公共连接createMockConnection(){
连接mockConnection=mock(Connection.class);
试一试{
doAnswer(新答案){
@凌驾
公共Void应答(invocationmock调用)抛出可丢弃的{
mockData=(字节[])调用.getArguments()[0];
返回null;
}
}).when(mockConnection).write(任意(byte[].class));
当(mockConnection.read())。然后回答(new Answer()){
@凌驾
公共字节[]应答(调用锁调用)抛出可丢弃{
返回模拟数据;
}
});
}捕获(例外e){}
返回模拟连接;
}
注意对
write()
方法的第一个
Answer
实例的更改。答案的类型表示返回类型。由于
write()
方法不返回任何内容,因此
Answer
实例应为
Answer
类型,其中
Answer()
方法返回
null
,因为
Void
类型没有实例-只能对其强制转换
null

其次,
read()
Answer
实例现在已经存在,取代了先前使用的
thenReturn()


我希望这有帮助。如果需要,请向我提问。

您是否真的模拟了
write()
read()
方法?我在任何地方都看不到这个。另外,你能准确地告诉我们你想测试什么吗?如果要测试实际连接,请设置集成测试。如果要对使用连接的代码进行单元测试,请模拟连接,使其按您想要的方式运行。当您调用
然后返回(mockData)
时,mockData仍然为null,因为还没有人对连接调用write(),因此答案还没有执行。您需要read()的另一个答案。但我真的不知道