2014-02-11 48 views
2

我正在使用EasyMock 3.2生成的一系列Strict Mocks來遞歸調用自身的方法。通過設置我的嘲笑的期望,我可以控制該方法,使其只調用一次,然後退出。但是,我看到EasyMock中的一些非常奇怪的行爲,看起來像一個錯誤,它讓人對預計方法的次數感到困惑。以遞歸方法使用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的任何限制?

+0

這是一個猜測,但嘗試改變'重播(srcCollection,經紀人);''來重播(srcCollection);' – Jason

+0

這將會是有助於查看您的getURI方法。 此外,請確保您不需要在NativeBroker類中模擬任何其他方法。 –

+0

@Jason如果我不重播'broker',那麼我對部分模擬中'getCollection'和'getSubject'的期望就會失敗。 – adamretter

回答

0

我看不出這段代碼有什麼問題。

經紀人的兩個模擬方法是否被期望不被調用?

我做了一個測試用例。你能讓它失敗嗎?

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); 
}} 
+0

經紀商的兩種方法預計會被調用,爲簡潔起見,我只是從最初的帖子中省略了它們。測試用例可以在這裏找到:https://github.com/adamretter/exist/blob/feature/fix-inherited-perms/test/src/org/exist/storage/NativeBrokerTest.java#L226 – adamretter

4

在我的情況下,我重複相同的期望值2次。它拋出:

java.lang.IllegalStateException:在mock上調用的最後一個方法已經有一個非固定的計數集。

E.G.

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 
+0

收到相同的錯誤並檢查出來 - 確保你沒有「期待」兩次相同的呼叫。我正在編輯一個單元測試,並沒有意識到之前有什麼被嘲笑。 – Juc