Java easymock:调用模拟时可以调用其他方法吗?



我想在调用特定的模拟方法时执行一些代码。

mock = EasyMock.createMock(ConListener.class);
// Record n Replay
mock.Connected();
mock.DataSent();
EasyMock.replay(mock);

sock = createCon(addr, mock)
// I want the send to be called only after the mock's Connected() is invoked.
sock.send("data");

有什么方法可以在调用模拟时执行调用操作?

mock.Connected().Invoke () //something like this? 

到目前为止,我所拥有的是,

mock = EasyMock.createMock(ConListener.class);
// Record n Replay
mock.Connected();
mock.DataSent();
EasyMock.replay(mock);
CompletableFuture<Void> connected = new CompletableFuture<Void>();
sock = createCon(addr, new ConListener() {
public void Connected() {
mock.Connected();
connected.complete(null);
}
public void DataSent() { mock.DataSent(); }
});
connected.get()
sock.send("data");

想检查是否有更好和干净的方式。

我找到了解决问题addDelegate。不是那么清晰和直观,但比我之前的方法稍微好一点。

interface ConListener {
void Connected();
void DataSent(int size);
}
// Having it as a class, so that I can only add stub codes,
// for a particular method and leave the rest.
class TestListener implements ConListener {
void Connected() {Assert.fail("")}
void DataSent(int size) {Assert.fail("")}
}

@Test
public void SomeTest() {
CompletableFuture<Void> connected = new CompletableFuture<Void>();
mock = EasyMock.createMock(ConListener.class);
// Record
mock.Connected();
EasyMock.expectLastCall().andDelegateTo(new TestListener() {
public void Connected() {
connected.complete(null);
}
});
EasyMock.expectLastCall().times(1); // This cannot come before adding delegates. Why?
EasyMock.replay(mock);
// Test
sock = createCon(addr, mock/*using actual mock*/);
connected.get(timeout, unit);
sock.send(blahblah);  
}

最新更新