簡體   English   中英

與遞歸方法一起使用EasyMock

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM