Powermock(使用 Easymock)没有最后一次调用模拟可用

Posted

技术标签:

【中文标题】Powermock(使用 Easymock)没有最后一次调用模拟可用【英文标题】:Powermock (With Easymock) no last call on a mock available 【发布时间】:2013-12-06 01:53:54 【问题描述】:

我正在尝试运行一个简单的测试用例。我有以下方法。

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

我阅读了 *** 上的其他一些帖子,但他们的解决方案似乎是他们将 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)
.
.
.

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

【问题讨论】:

没有。我目前没有使用 Maven。 @RenéLink 我用 JavaAssist 解决了这个问题。原来我只是在项目中没有图书馆。所以现在很好。但是,我现在有一个新问题,上面写着“不是模拟”。 【参考方案1】:

您是否使用@RunWith(PowerMockRunner.class)@PrepareForTest(CommandLineOptionProcessor.class) 注释了测试类?

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

     @Test
     public void testRun()

您需要在测试类级别使用@PrepareForTest(CommandLineOptionProcessor.class)。见Powermock doc:

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

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

在您的情况下,缺少 javassist 库。把它放在类路径上。也许其他一些库也丢失了......我们会看到。

如果你得到

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

那么你使用的是EasyMock.replay(),但你必须使用PowerMock.replay()

【讨论】:

哦,好吧。我曾尝试过@PrepareForTest,但我是在方法级别完成的。当我有 @PrepareForTest(CommandLineOptionProcessor.class) 和 @RunWith(PowerMockRunner.class) 到类级别时,我现在收到一个新错误。我将使用错误编辑我的原始帖子。 是的,我也发现了。我不得不对我的测试再做一次更改(但这只是我的测试失败)。现在效果很好。感谢所有帮助和使用 Powermock 模拟静态方法的演练。定义。刚接触它时会有点困惑。【参考方案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( );

【讨论】:

将它添加到测试类有什么作用? 我遇到了一个问题 - 尝试模拟静态类时出现异常,这对我有帮助。

以上是关于Powermock(使用 Easymock)没有最后一次调用模拟可用的主要内容,如果未能解决你的问题,请参考以下文章

PowerMock、EasyMock 和 Mockito 框架有啥区别? [复制]

如何嘲笑使用JUnit,EasyMock的或PowerMock静态final变量

PowerMock框架讲解及使用

PowerMock单元测试

使用 Powermock 时出现 NoClassDefFoundError

PowerMock ECLemma 覆盖问题