Powermock(使用Easymock)没有模拟上的最后一个调用可用

2022-09-02 13:13:57

我试图只运行一个简单的测试用例。我有以下方法。

public static void run(String[] args) throws Throwable {
    CommandLineArguments opts = CommandLineOptionProcessor.getOpts(args);
}

我将继续构建此方法/测试用例。但是,我只是想确保一个简单的测试用例首先起作用。所以我写了下面的测试。

@Test
public void testRun() {
    String[] args = {"--arg1", "value", "--arg2", "value2"};

    mockStatic(CommandLineOptionProcessor.class);
    expect(CommandLineOptionProcessor.getOpts(args));

    EasyMock.replay(CommandLineOptionProcessor.class);
}

之后,我收到以下错误:

java.lang.IllegalStateException: no last call on a mock available

我读了StackOverflow上的其他一些帖子,但他们的解决方案似乎是他们正在将PowerMock与Mockito一起使用。我正在使用Powermock和Easymock,所以这应该不是问题。

我听从了Rene的建议,将以下内容添加到我的班级顶部。

@PrepareForTest(CommandLineOptionProcessor.class)
@RunWith(PowerMockRunner.class)
public class DataAssemblerTest {

我修复了之前的错误。但现在我有这个错误。

java.lang.IllegalArgumentException: Not a mock: java.lang.Class
at org.easymock.internal.ClassExtensionHelper.getControl(ClassExtensionHelper.java:61)
at org.easymock.EasyMock.getControl(EasyMock.java:2172)
at org.easymock.EasyMock.replay(EasyMock.java:2074)
.
.
.

任何关于可能导致这种情况的想法都会很棒。


答案 1

是否使用 和 对测试类进行了批注?@RunWith(PowerMockRunner.class)@PrepareForTest(CommandLineOptionProcessor.class)

 @RunWith(PowerMockRunner.class)
 @PrepareForTest(CommandLineOptionProcessor.class)
 public class TestClass {

     @Test
     public void testRun(){

您需要在测试类级别。请参阅 Powermock 文档@PrepareForTest(CommandLineOptionProcessor.class)

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

还要确保所需的库位于测试类路径上。

在你的情况下,javassist库丢失了。把它放在类路径上。也许其他一些库也丢失了...我们拭目以待。

如果您获得

java.lang.IllegalArgumentException: Not a mock: java.lang.Class

那么你正在使用 ,但你必须使用EasyMock.replay()PowerMock.replay()


答案 2
 EasyMock.expectLastCall() 

 EasyMock.expectLastCall().anyTimes() 

 EasyMock.expectLastCall().andAnswer(..)

在你的代码中不存在,必须在你想要测试的方法之后,以防你的测试方法是void方法。

否则,您可以使用:

expect(CommandLineOptionProcessor.getOpts(args)).andReturn(object);

也请把这个添加到你的测试类:

  @ObjectFactory
public IObjectFactory getObjectFactory() {

    return new org.powermock.modules.testng.PowerMockObjectFactory( );
}

推荐