需要一些基本的PowerMock / EasyMock问题的帮助

时间:2011-03-11 23:44:02

标签: java junit easymock powermock

我对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);
    }
}

现在,在测试类中,我想测试Bar方法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()语句,我总会得到除零异常。但是,通过在那里使用suppress语句,我得到一个断言错误,它说doStuff预计会被调用一次,而实际的调用是0。

那么,为什么这个方法算不算执行?

我如何让模拟内容“存根”该方法,以便它被视为执行时没有真正做任何事情?

我一直在处理的情况实际上在doStuff上有一个void返回。对于没有返回值的处理方法,如何处理必要的模拟语句与那些做什么?

不同

似乎我正处于开展这项工作的尖端,但我觉得我在这里尝试了一些不正确的语句组合。我已经开始关注这个问题,阅读了一些例子,我仍然很短暂。

任何帮助?

谢谢,

克雷格

1 个答案:

答案 0 :(得分:3)

从PowerMock文档中查看此内容:http://code.google.com/p/powermock/wiki/MockConstructor

类似的东西:

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

编辑:添加文档的真实相关部分(Craig自己找到):

  

使用@PrepareForTest( ClassThatCreatesTheNewInstance .class)   在类的级别注释   测试用例。