单元测试方法失败,其中包含lambda表达式Android Studio

Vic*_*yan 10 java lambda android unit-testing android-studio

问题描述

我写了一个使用Lambda表达式的简单示例.代码工作正常,直到我对它进行单元测试.一旦我运行单元测试,它就会因为下面的错误而失败

环境

Android Studio 2.2预览版3

错误

编译器发生异常(1.8.0_76-release).在检查错误数据库(http://bugs.java.com)是否有重复项后,请通过Java错误报告页面(http://bugreport.java.com)向Java编译器提交错误.在报告中包含您的计划和以下诊断.谢谢.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));
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

RxDeferTest.java

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

    @Test
    public void createDefer() {
        RxDefer defer = new RxDefer();
        defer.createDefer();
    }
}
Run Code Online (Sandbox Code Playgroud)

的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'
    )
}
Run Code Online (Sandbox Code Playgroud)

bpr*_*r10 0

正如我从您的依赖项中看到的,您正在使用 android studio 的 Jack$Jill 编译器来使用 lambda 表达式。我宁愿建议使用Retrolambda。您可以查看这篇文章,了解有关如何从此链接进行配置的更多信息。

逆转录酶的好处:

您也可以将它与低于 24.0.0 的构建工具版本一起使用,而 jack 编译器则不然。

正如上面所建议的,这个问题似乎在retrolambda 中得到了解决。