我對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上有無效回報。如何處理沒有返回值的方法所需的模擬語句與之相比有什麼不同?
看起來好像我在做這項工作的風口浪尖上,但我覺得我在這裏嘗試了一些不正確的陳述組合。我已經在這方面打了我的腦袋,閱讀了大量的例子,但我仍然缺乏。
任何幫助?
感謝,
克雷格
testOtherStuff方法已包含您描述的調用createMock和expectNew。 – krock 2011-03-11 23:59:19
哇。當我改變PrepareForTest來使用Bar類而不是Foo類時,它實際上起作用了。顯然,我一直在準備錯誤的課程。驚人。非常感謝! – 2011-03-12 00:16:59
@ krock,非常真實。壞我。我更新了克雷格自己發現的解決方案,就這樣在這裏。 – 2011-03-12 00:23:40