UnExpected Method调用断言错误

时间:2013-12-27 12:25:49

标签: easymock

我是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“,那么两个测试用例都是有人可以解释一下为什么会出现这种行为吗?

1 个答案:

答案 0 :(得分:0)

我在这里看到了两个问题:

  1. 依赖项声明为static,但随后在构造函数中从参数初始化。
  2. 传递给execute(object)方法的对象未传递给handle()方法。
  3. 问题1是一个设计问题,而不是其他任何问题。如果您想在每次创建新FilterExecutor(或Filter)时初始化FilterExetnsion,那么为什么不将其设为实例变量?它显然固有地链接到类的特定实例,而不是类本身。

    问题2可能是设计问题,或者可能与测试中的期望有关。在方法调用test.handle()内,调用filter.execute(object)。但是,测试类不提供传递给execute的对象。这意味着filter.execute(object)中传递的对象与您在EasyMock.expect(f.execute(object)).andReturn(Obj1);

    中所说的预期不同

    有两种方法可以解决这个问题:

    • A)改变您对使用Capture的期望。
    • B)更改您的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
    }