2

我想用JUnitand对我的班级进行单元测试EasyMock。它延伸android.location.Location. 但是我总是遇到Stub!异常,因为大多数 Android 方法在 JVM 运行时中不可用。

public class MyLocation extends Location {
    public MyLocation(Location l) {
        super(l);
    }

    public boolean methodUnderTest() {
        return true;
    }
}

我尝试使用 模拟构造函数调用Powermock,但看起来它不适用于super调用。我的测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Location.class)
public class MyLocationTest {
    @Test
    public void methodUnderTestReturnsTrue() throws Exception {
        Location locationMock = EasyMock.createMock(Location.class);
        expectNew(Location.class, Location.class).andReturn(locationMock);
        MyLocation myLocation = new MyLocation(locationMock);
        assertTrue(myLocation.methodUnderTest());
    }
}

我得到一个例外:

java.lang.RuntimeException: Stub!
    at android.location.Location.<init>(Location.java:6)

显然解决方案是在Android 运行时执行这个测试(即启动Android Simulator)。但我不喜欢这种方法,因为启动这样的测试套件需要相当长的时间。有没有办法存根super调用或者可能有更好的方法来测试这样的实现?

4

1 回答 1

2

直接取自 Powermocks 文档。

然后可以在不调用EvilParent构造函数的情况下完成测试。

@RunWith(PowerMockRunner.class)
@PrepareForTest(ExampleWithEvilParent.class)
public class ExampleWithEvilParentTest {

        @Test
        public void testSuppressConstructorOfEvilParent() throws Exception {
                suppress(constructor(EvilParent.class));
                final String message = "myMessage";
                ExampleWithEvilParent tested = new ExampleWithEvilParent(message);
                assertEquals(message, tested.getMessage());
        }
}
于 2013-10-08T20:51:23.227 回答