2011-03-11 73 views
1

我對PowerMock/EasyMock的世界比較陌生,而我認爲應該相對直接的東西應該是不起作用的。也許有人可以告訴我我要去哪裏錯了。需要一些基本的PowerMock/EasyMock問題的一些幫助

考慮這兩個類:

public class Foo 
{ 
    public int doStuff(int a) 
    { 
     return (5/a); 
    } 
} 

public class Bar 
{ 
    public void doSomething() 
    { 
     Foo foo = new Foo(); 
     int c = foo.doStuff(0); 
    } 
} 

現在,測試類,我想測試的杆法DoSomething的。我得到的問題是它使用Foo。正如你所看到的,將0傳遞給Foo將導致被零除錯誤。我想將/ Foo.doStuff()取消/壓縮,以防止這種情況發生。我真正需要做的是確保doStuff()實際上被調用。所以,我已經這樣做了:

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ Foo.class })     

public class TestStuff 
{ 

@Test 
public void testOtherStuff() throws Exception 
{ 

    Foo fooMock = PowerMock.createMock(Foo.class); 
    expectNew(Foo.class).andReturn(fooMock); 
    EasyMock.expect(fooMock.doStuff(anyInt())).andReturn(1); 
    //fooMock.doStuff(anyInt()); 

    //suppress (method(Foo.class, "doStuff")); 

    replayAll(); 

    Bar bar = new Bar(); 
    bar.doSomething(); 

    verifyAll(); 
} 
} 

當我運行這個時,我得到除零除異常。我曾經想過使用expect()調用,並指定返回值1會阻止該方法執行。這顯然不是這種情況。所以第一個問題是,爲什麼不呢?

所以然後我試着做上面評論的陳述。也就是說,我將expect()調用註釋掉了,並使用了另外兩個語句,認爲我必須禁止該方法的執行。我發現如果我沒有執行suppress()語句,我總是會得到被零除的例外。但是,通過在那裏設置抑制語句,我得到一個斷言錯誤,它表示doStuff預計稱爲1次,實際調用爲0.

那麼,爲什麼不將方法計算爲執行?

如何獲得模擬的東西來「存根」的方法,以便它被視爲被執行通過沒有真的做任何事情?

我一直在處理的情況實際上在doStuff上有無效回報。如何處理沒有返回值的方法所需的模擬語句與之相比有什麼不同?

看起來好像我在做這項工作的風口浪尖上,但我覺得我在這裏嘗試了一些不正確的陳述組合。我已經在這方面打了我的腦袋,閱讀了大量的例子,但我仍然缺乏。

任何幫助?

感謝,

克雷格

回答

3

看看這個從PowerMock文檔:http://code.google.com/p/powermock/wiki/MockConstructor

喜歡的東西:

Foo fooMock = createMock(Foo.class); 
expectNew(Foo.class, 0).andReturn(fooMock); 

編輯:添加文檔的實際相關部分(克雷格自己發現的):

使用@PrepareForTest(ClassThatCreatesTheNewInstance的.class) 註釋在 測試用例的類級。

+0

testOtherStuff方法已包含您描述的調用createMock和expectNew。 – krock 2011-03-11 23:59:19

+0

哇。當我改變PrepareForTest來使用Bar類而不是Foo類時,它實際上起作用了。顯然,我一直在準備錯誤的課程。驚人。非常感謝! – 2011-03-12 00:16:59

+0

@ krock,非常真實。壞我。我更新了克雷格自己發現的解決方案,就這樣在這裏。 – 2011-03-12 00:23:40