2011-03-11 92 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