PowerMock - IllegalStateException:必须重播类XXX才能获得配置的期望

时间:2012-11-05 20:52:19

标签: java unit-testing junit powermock

@PrepareForTest({...,..., XXX.class})
...
@Test
public void testMethodToBeTested(){
    XXX mockInstance = PowerMock.createMock(XXX.class); 
    ...
    PowerMock.expectNew(XXX.class, p1, p2, p3, p4, p5).andReturn(mockInstance);
    mockInstance.methodWithNoReturnVal();
    expect(mockInstance.getSearchVal()).andReturn(1);
    PowerMock.replay(mockInstance);
    Whitebox.invokeMethod(objInstance, "methodToBeTested");

    PowerMock.verify(mockInstance);
}

基本上,我想测试一个私有方法:methodToBeTested()。此方法实例化XXX.class类型的对象(使用new运算符)并将其存储到实例变量中;我嘲笑这个对象。然后,它通过mock调用methodWithNoReturnVal(),然后调用我配置为返回1的getter方法。

我收到错误“IllegalStateException:必须重播类XXX.class以获得配置的期望。”

感谢任何帮助。我还是PowerMock和EasyMock的新手;因为我需要使用expectNew(...)方法,所以我确保在测试方法中使用所有PowerMock api。

2 个答案:

答案 0 :(得分:3)

你需要在Powermock的方法中有一个PowerMock.replay(XXX.class);来拦截对象的构造。见下文。

@PrepareForTest({...,..., XXX.class})
...
@Test
public void testMethodToBeTested(){
    XXX mockInstance = PowerMock.createMock(XXX.class); 
    ...
    PowerMock.expectNew(XXX.class, p1, p2, p3, p4, p5).andReturn(mockInstance);
    mockInstance.methodWithNoReturnVal();
    expect(mockInstance.getSearchVal()).andReturn(1);
    PowerMock.replay(mockInstance, XXX.class);
    Whitebox.invokeMethod(objInstance, "methodToBeTested");

    PowerMock.verify(mockInstance);
}

答案 1 :(得分:0)

这可能是PowerMock中的一个未解决的问题。

查看http://code.google.com/p/powermock/issues/detail?id=271&q=IllegalStateException了解详情。