Я пишу несколько тестов POJO для своего Android-кода.
Я хочу запускать их локально с JDK (не с Dalvik на эмуляторе) - для скорости, JUnit 4, Mockito и возможностью безголового без устройства - поэтому у меня есть отдельный проект Java в Eclipse.
Если метод, который я тестирую, ссылается на что-либо из Android SDK, например. android.util.Log
, тест терпит неудачу - это имеет смысл, потому что android.jar
не находится в пути к классам. Чтобы воспроизвести, у меня есть этот тестовый пример:
public class FooTests {
@Test
public void testFoo() {
android.util.Log.d("x", "y");
}
}
Если я добавлю android.jar
явно к траектории класса тестового проекта, я получаю исключения, такие как
java.lang.RuntimeException: Stub!
at android.util.Log.d(Log.java:7)
at com.example.FooTests.testFoo(FooTests.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Есть ли способ заставить код работать без издевательства со всеми последними битками Android SDK? Возможно, уже существует издеваемое android.jar
?
EDIT. На данный момент я закончил обертку классов типа android.util.Log
и ввел их в экземпляры для классического тестирования на основе IOC. Предложение Scott PowerMock - это мой следующий шаг, когда он мне понадобится.
LATER EDIT: Robolectric!