1

我对 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() 语句,我总是会得到除以零的异常。但是,通过在其中添加抑制语句,我得到一个断言错误,它说 doStuff 应该被调用 1 次,而实际调用是 0。

那么,为什么该方法不被视为已执行?

我如何让模拟的东西“存根”该方法,以便它被认为是被执行的并没有真正做任何事情?

我一直在处理的情况实际上对 doStuff 有一个无效的回报。对于处理没有返回值的方法,与那些有返回值的方法相比,必要的模拟语句有何不同?

似乎我正处于完成这项工作的风口浪尖,但我觉得我在这里尝试了某种不正确的陈述组合。我已经对此深有感触,阅读了一堆示例,但仍然不足。

有什么帮助吗?

谢谢,

克雷格

4

1 回答 1

3

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

就像是:

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

编辑: 添加文档的真正相关部分(克雷格自己找到的):

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

于 2011-03-11T23:51:55.560 回答