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()的另一个答案。但我真的不知道