将PowerMockito与静态方法一起使用时发生异常

时间:2018-07-06 20:17:06

标签: java unit-testing junit mockito 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.getControlForLastCall(EasyMock.java:520)在   org.easymock.EasyMock.expect(EasyMock.java:498)

有人可以帮助我吗?为什么会失败?我是PowerMockito的新手,不知道该怎么做!

2 个答案:

答案 0 :(得分:2)

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

使用 Powermock 只是屈服于这种不良设计。

是的,仅具有static方法的类称为实用程序类

但是您应该克服这种误解,即提供常见行为的类应该(仅)具有static方法。

根据经验,整个程序中应该只有一个非私有 static方法,即main()

答案 1 :(得分:0)

您似乎在混合模拟框架。

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

由于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);
    }
}

也就是说,我建议不要将您的代码紧密耦合到静态依赖项。这使测试代码变得困难。