Метод тестирования единицы измерения, который содержит лямбда-выражение Android Studio

Описание проблемы

Я написал простой пример, который использует выражение Lambda. Код работает нормально, пока я не запустил на нем unit test. Как только я запустил unit test, он терпит неудачу из-за ошибки ниже

Окружающая среда

Android Studio 2.2 Preview 3

Ошибка

В компиляторе произошла ошибка (1.8.0_76-release). пожалуйста файл ошибка с компилятором Java через страницу отчетов об ошибках Java (http://bugreport.java.com) после проверки базы данных ошибок (http://bugs.java.com) для дубликатов. Включите свою программу и после диагностики в вашем отчете. Спасибо. com.sun.tools.javac.code.Symbol $CompletionFailure: файл класса для java.lang.invoke.MethodType не найден

: app: compileDebugJavaWithJavac FAILED

FAILURE: сбой сборки с исключением.

  • Что пошло не так: выполнение выполнено для задачи ': app: compileDebugJavaWithJavac'.

    Ошибка компиляции; для получения подробной информации см. вывод ошибки компилятора.

  • Попробуйте: запустите с опцией -stacktrace, чтобы получить трассировку стека. Запустите с опцией -info или --debug, чтобы получить больше выходных данных журнала.

СТРОГО НЕИСПРАВНО

RxDefer.java

import rx.Observable;
import rx.Subscriber;

class RxDefer {

    private Observable<Integer> getInt() {
        return Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> aSubscriber) {
                if (aSubscriber.isUnsubscribed())
                    return;

                aSubscriber.onNext(42);
                aSubscriber.onCompleted();
            }
        });
    }

    void createDefer() {
        Observable.defer(RxDefer.this::getInt).subscribe(aInteger -> {
            System.out.println(String.valueOf(aInteger));
        });
    }
}

RxDeferTest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest(RxDefer.class)
public class RxDeferTest {

    @Test
    public void createDefer() {
        RxDefer defer = new RxDefer();
        defer.createDefer();
    }
}

build.gradle

apply plugin: 'com.android.application'

android {
    ...

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    ...

    testCompile(
            'junit:junit:4.12'
            , 'org.robolectric:robolectric:3.0'
            , 'org.powermock:powermock-module-junit4:1.6.4'
            , 'org.powermock:powermock-module-junit4-rule:1.6.4'
            , 'org.powermock:powermock-api-mockito:1.6.4'
            , 'org.powermock:powermock-classloading-xstream:1.6.4'
    )
}

Ответ 1

Как я могу видеть из ваших зависимостей, вы используете компилятор Jack $Jill студии android для использования лямбда-выражений. Я предпочел бы использовать retrolambda. Вы можете проверить этот пост для получения дополнительной информации о том, как настроить эту ссылку .

Бенифиты ретрометаны:

Вы можете использовать его также с версией инструмента сборки ниже 24.0.0, которая это не так с компилятором jack.

И как было сказано выше, этот вопрос кажется исправленным в ретроальбанде.