5

出于某种原因,我没有遵循一个非常直接的 PowerMock 示例。

我包含powermock-mockito-1.5.1-full在我的类路径中,我尝试测试一个公共的最终方法(按照这个例子)。

由于某种原因,我无法导入PowerMock课程。

import org.junit.*;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.cleancode.lifesaver.camera.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest(android.hardware.Camera.class)
public class CameraTests {

    private android.hardware.Camera _cameraMock;

    @Before
    public void setUp() {
        _cameraMock = PowerMockito.mock(android.hardware.Camera.class);
    }

    @Test 
    public void releaseCamera() {
        ICamera camera = new Camera(_cameraMock);

        // Compile error: PowerMock can't be resolved       
        PowerMock.replay(_cameraMock);
        // I also tried PowerMockito.replay(_cameraMock) but that also doesn't exist.

        camera.release();

        Mockito.verify(_cameraMock).release();
    }
}

正如评论所解释的,PowerMock该类无法从电源模拟 jar 中导入。

这感觉像是一个愚蠢的问题,但我真的在互联网上找不到任何东西。

我应该在哪里可以找到静态类PowerMock?我还使用 Java Decompile 搜索了 powermock 库,没有命中 powermock / replay。

4

2 回答 2

8

您所遵循的示例PowerMock.replay(_cameraMock);是使用 EasyMock,而您似乎想要 Mockito。看看这个关于 mockito 和 power mock的教程

于 2013-09-20T09:39:38.677 回答
0

我建议你不要在你的 (Before) 方法中创建你的模拟setUp(),因为模拟非常复杂,例如,如果你为所有人声明一个“通用”模拟,你可以准确地告诉它应该调用一个方法的时间您的测试很难控制这种行为。

也许(没有我只能猜测的代码)您希望android.hardware.Camera在您的方法中调用您的Camera.release()方法,对吗?所以我会这样做:

您尝试模拟的方法不是静态的,它是一个正常的 final 方法。您可以尝试这样做:

android.hardware.Camera mock = PowerMock.createMock(android.hardware.Camera.class);
PowerMock.expect(mock.release());
PowerMock.replay();

ICamera camera = new Camera(mock);
camera.release();
PowerMock.verify(mock);

如果在测试失败camera.relase()的方法中没有准确地调用inside。android.hardware.Camera.release()

于 2013-09-20T09:54:27.130 回答