使用静态方法使用PowerMockito时出现异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用静态方法使用PowerMockito时出现异常相关的知识,希望对你有一定的参考价值。

我想使用PowerMockito模拟静态方法,

public class DepedencyService {

    public static int getImportantValue() {
        return -4;
    }
}

public class Component {

    public int componentMethod() {
        return DepedencyService.getImportantValue();
    }
}

但它给了我一个例外。

import static org.testng.Assert.assertEquals;
import org.easymock.EasyMock;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(DepedencyService.class)
public class ComponentTest {
    @Test
    public void testComponentMethod() {
        Component c = new Component();
        PowerMockito.mockStatic(DepedencyService.class);
        EasyMock.expect(DepedencyService.getImportantValue()).andReturn(1);
        assertEquals(1, c.componentMethod());
    }
}

例外: -

java.lang.IllegalStateException:org.easymock.EasyMock.expect上的org.easymock.EasyMock.getControlForLastCall(EasyMock.java:520)上可用的模拟上没有最后一次调用(EasyMock.java:498)

谁能帮帮我吗?为什么这会失败?我是PowerMockito的新手,不知道该怎么做!

答案

你似乎在混合模拟框架。

在执行测试之前,您需要正确排列静态依赖项

由于PowerMockito用于模拟静态类,因此您应该使用Mockito来安排预期的行为

例如

@RunWith(PowerMockRunner.class)
@PrepareForTest(DepedencyService.class)
public class ComponentTest {
    @Test
    public void testComponentMethod() {
        //Arrange        
        int expected = 1;
        PowerMockito.mockStatic(DepedencyService.class);
        Mockito.when(DepedencyService.getImportantValue()).thenReturn(expected);
        Component subject = new Component();

        //Act
        int actual = subject.componentMethod();

        //Assert
        assertEquals(expected, actual);
    }
}

也就是说,我建议不要让你的代码与静态依赖关系紧密耦合。这使得测试代码变得困难。

另一答案

您的主要问题是您正在编写STUPID code(就像我们大多数人在开始时所做的那样),您应该编写SOLID代码。

运用 Powermock 只是对这种糟糕设计的投降。

是的,只有static方法的类称为实用程序类。

但是你应该克服这种误解,即提供共同行为的类应该(仅)使用static方法。

根据经验,在整个程序中应该只有一个非私人static方法,这就是main()

以上是关于使用静态方法使用PowerMockito时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

使用PowerMockito 对静态类进行mock

在静态类中的记录器上使用锁时出现异常

Mockito / PowerMockito每次在不同实例的循环中模拟静态方法?

使用PowerMockito和Mockito进行模拟测试,包括静态方法测试,私有方法测试等

PowerMockito 模拟单个静态方法并返回对象

从包中加载 NIB 时出现异常