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变量