我是EasyMock的新手,正在努力解决我在运行测试用例时遇到的以下问题。单元测试失败为“UnExpected Method Call execute”。首先,这是我的应用程序代码:
class Filter {
Filter(FilterExecutor f) {
filter = f;
}
static FilterExecutor filter;
void handle() {
filter.execute(object);
}
//some logic here
};
class FilterExtension extends Filter {
FilterExtension(FilterExecutor f) {
super(f);
}
void handle() {
//some logic here
super.handle();
}
}
测试用例:
class Tests {
FilterExecutor f;
@Override
public void Tests() {
f=EasyMock.createMock(FilterExecutor.class);
}
@Test
public void test1 {
EasyMock.expect(f.execute(object)).andReturn(Obj1);
EasyMock.replay(f);
FilterExtension test = new FilterExtension(f);
test.handle();
//Assert
}
@Test
public void test2 {
//More or less similar to above
EasyMock.expect(f.execute(object)).andReturn(Obj1);
EasyMock.replay(f);
FilterExtension test = new FilterExtension(f);
test.handle();
}
}
如果上述测试用例单独运行,则测试正在通过。如果它们一起运行,那么其中一个测试通过,而另一个给出一个断言错误“”UnExpected Method Call execute“。如果我在一个测试用例的末尾添加”Filter.filter = null“,那么两个测试用例都是有人可以解释一下为什么会出现这种行为吗?
答案 0 :(得分:0)
我在这里看到了两个问题:
execute(object)
方法的对象未传递给handle()
方法。问题1是一个设计问题,而不是其他任何问题。如果您想在每次创建新FilterExecutor
(或Filter
)时初始化FilterExetnsion
,那么为什么不将其设为实例变量?它显然固有地链接到类的特定实例,而不是类本身。
问题2可能是设计问题,或者可能与测试中的期望有关。在方法调用test.handle()
内,调用filter.execute(object)
。但是,测试类不提供传递给execute
的对象。这意味着filter.execute(object)
中传递的对象与您在EasyMock.expect(f.execute(object)).andReturn(Obj1);
有两种方法可以解决这个问题:
handle
方法以接受该对象,然后将其提供给您测试中的handle
方法调用。对于选项A,See this good Stack Overflow post
我认为测试方法看起来有点像这样:
@Test
public void test1() {
final Capture<Object> object = new Capture<Object>();
EasyMock.expect(this.mockFilterExecutor.execute(EasyMock.capture(object))).andReturn(new Object());
EasyMock.replay(this.mockFilterExecutor);
final FilterExtension test = new FilterExtension(this.mockFilterExecutor);
test.handle();
final Object capturedObject = object.getValue();
//Assert
}
对于选项B您可以执行以下操作,但很明显,如果无法在execute()
之外构建或接收您提供给handle()
的对象,则此操作将不可行方法
Filter
类中的句柄方法如下所示:
public void handle(final Object object) {
this.filter.execute(object);
}
FilterExtension
类中的句柄方法如下所示:
@Override
public void handle(final Object object) {
super.handle(object);
}
你的测试看起来像这样:
@Test
public void test1() {
final Object object = new Object();
EasyMock.expect(this.mockFilterExecutor.execute(object)).andReturn(object);
EasyMock.replay(this.mockFilterExecutor);
final FilterExtension test = new FilterExtension(this.mockFilterExecutor);
test.handle(object);
//Assert
}