我试图运行一个简单的测试用例。我有以下方法。
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上阅读了其他一些帖子,但他们的解决方案似乎是他们在Mockito上使用了PowerMock。我正在使用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)
.
.
.
关于可能导致这种情况的任何想法都会很棒。
答案 0 :(得分:19)
您是否使用@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()
答案 1 :(得分:0)
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( );
}