0

我正在尝试使用 Easymock 测试一个算法,但我偶然发现了该算法的实现细节。谁能给我一条出路?给我一个问题的部分是:

interface A {
 B getB ();
}

interface B {
  void setX (int x);
  void doSomething ();
}

现在在被测算法的某个地方发生了这种情况:

a.getB ().setX (9);
a.getB ().doSomething ();
a.getB ().setX (16);

这会导致意外的方法调用 getB () 因为我的测试只声明了有趣的部分:

B b = EasyMock.createStrictControl ();
b.setX (9);
EasyMock.expectLastCall();
b.doSomething ();
EasyMock.expectLastCall();

我知道这是因为订单已检查。但即使我放置以下行,也没有任何变化。

EasyMock.expect (a.getB ()).andReturn (b).anyTimes ();

实例 a 也是一个 EasyMock 代理。

谁能帮帮我?

4

3 回答 3

1

根据您的最后一点代码使用anyTimes(),但不要使用严格的模拟 - 这是强制执行排序的严格性。

诚然,我不记得 EasyMock 如何处理控件之间的排序的细节,但听起来你真的不关心排序。

于 2010-07-15T09:21:39.800 回答
0

以下对我来说很好。我正在使用严格的模拟,但我对这种方法没有任何经验createStrictControl()

B b = EasyMock.createStrictMock(B.class);
A a = EasyMock.createStrictMock(A.class);
expect(a.getB()).andReturn(b).anyTimes();

b.setX(9);
b.doSomething();
b.setX(16);

replay(a);
replay(b);
a.getB().setX(9);
a.getB().doSomething();
a.getB().setX(16);
verify(b);
verify(a);
于 2010-07-15T15:15:13.017 回答
0

显然andStubReturn (b)可以解决问题。

于 2010-07-15T09:33:40.617 回答