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

Cam*_*nes 11 java junit unit-testing easymock powermock

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

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

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

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

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

    EasyMock.replay(CommandLineOptionProcessor.class);
}
Run Code Online (Sandbox Code Playgroud)

之后我收到以下错误:

java.lang.IllegalStateException: no last call on a mock available
Run Code Online (Sandbox Code Playgroud)

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

我遵循了Rene的建议并将以下内容添加到了我的班级.

@PrepareForTest(CommandLineOptionProcessor.class)
@RunWith(PowerMockRunner.class)
public class DataAssemblerTest {
Run Code Online (Sandbox Code Playgroud)

我修复了上一个错误.但现在我有这个错误.

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)
.
.
.
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*ink 20

你用@RunWith(PowerMockRunner.class)和注释了测试类@PrepareForTest(CommandLineOptionProcessor.class)吗?

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

     @Test
     public void testRun(){
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

如果你得到

java.lang.IllegalArgumentException: Not a mock: java.lang.Class
Run Code Online (Sandbox Code Playgroud)

然后你正在使用EasyMock.replay(),但你必须使用PowerMock.replay()