[英]Using EasyMock with recursive method
我正在使用一系列由EasyMock 3.2生成的Strict Mocks,來測試一種遞歸調用自身的方法。 通過設置模擬的期望值,我可以控制該方法,使其僅調用一次然后退出。 但是,我從EasyMock看到一些非常奇怪的行為,它看起來像一個錯誤,在該錯誤中人們對期望方法的次數感到困惑。
例如:
final Collection srcCollection = EasyMock.createStrictMock(Collection.class);
final NativeBroker broker = EasyMock.createMockBuilder(NativeBroker.class)
.addMockedMethod("getCollection")
.addMockedMethod("getSubject")
.createStrictMock();
expect(srcCollection.getURI()).andReturn(src);
replay(srcCollection, broker);
//run the test
broker.checkPermissionsForCopy(srcCollection, dest, newName);
verify(srcCollection, broker);
從EasyMock導致錯誤:
java.lang.AssertionError:
Expectation failure on verify:
Collection.getURI(): expected: 2, actual: 1
at org.easymock.internal.MocksControl.verify(MocksControl.java:226)
at org.easymock.EasyMock.verify(EasyMock.java:2080)
我只指示EasyMock期待一個結果,為什么它認為我想要兩個? 如果我將期望值更改為此,也會遇到相同的錯誤:
expect(srcCollection.getURI()).andReturn(src).once();
...變得陌生...
如果我將期望更改為:
expect(srcCollection.getURI()).andReturn(src).times(2);
我得到錯誤:
java.lang.AssertionError:
Expectation failure on verify:
Collection.getURI(): expected: 3, actual: 1
at org.easymock.internal.MocksControl.verify(MocksControl.java:226)
at org.easymock.EasyMock.verify(EasyMock.java:2080)
而且,如果我將期望值改為:
expect(srcCollection.getURI()).andReturn(src).anyTimes();
我得到一個甚至更陌生的錯誤:
java.lang.IllegalStateException: last method called on mock already has a non-fixed count set.
at org.easymock.internal.MocksControl.replay(MocksControl.java:216)
at org.easymock.EasyMock.replay(EasyMock.java:2012)
是否有人對EasyMock遞歸函數有任何建議或了解任何限制?
就我而言,我重復了兩次相同的期望值。 它拋出:
java.lang.IllegalStateException:在模擬上調用的最后一個方法已經設置了一個非固定的計數集。
例如
SchedulingDataForVersion dataForVersion = createNiceMock(SchedulingDataForVersion.class);
TaskSource mockedTaskSource = createNiceMock(TaskSource.class);
expect(mockedTaskSource.getOrderElement()).andReturn(orderLine).anyTimes();
expect(mockedTaskSource.getOrderElement()).andReturn(orderLine).anyTimes();
replay(dataForVersion, mockedTaskSource);
正確的一個是:
SchedulingDataForVersion dataForVersion = createNiceMock(SchedulingDataForVersion.class);
TaskSource mockedTaskSource = createNiceMock(TaskSource.class);
expect(dataForVersion.getOrderElement()).andReturn(orderLine).anyTimes();
expect(mockedTaskSource.getOrderElement()).andReturn(orderLine).anyTimes();
replay(dataForVersion, mockedTaskSource
我看不到這段代碼有什么問題。
是否不希望在代理上調用這兩個模擬方法?
我做了一個測試用例。 你能使它失敗嗎?
public class AppTest {
public static interface Collection {
String getURI();
}
public static class NativeBroker {
public void checkPermissionsForCopy(Collection srcCollection, String dest,
String newName) {
srcCollection.getURI();
}
public Collection getCollection() {
return null;
}
public String getSubject() {
return null;
}
}
String src = "http://src.com";
String dest = "http://dest.com";
String newName = "my name";
@Test
public void testApp() {
final Collection srcCollection = EasyMock.createStrictMock(Collection.class);
final NativeBroker broker = EasyMock.createMockBuilder(NativeBroker.class)
.addMockedMethod("getCollection")
.addMockedMethod("getSubject")
.createStrictMock();
expect(srcCollection.getURI()).andReturn(src);
replay(srcCollection, broker);
// run the test
broker.checkPermissionsForCopy(srcCollection, dest, newName);
verify(srcCollection, broker);
}}
當您添加.anyTimes()
,然后編寫相同的調用時,將發生錯誤。
expect(mock.get()).andReturn("string").anyTimes();
->具有多個支持的首次調用expect(mock.get()).andReturn("string");
->不需要第二個電話
解決方案是僅編寫具有多個支持的第一個電話
expect(mock.get()).andReturn("string").anyTimes();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.