相关疑难解决方法(0)

Lambdas,多个forEach与铸造

需要一些帮助思考来自我的同伴StackOverflow名人的lambda.

选择列表列表以在图表中深入收集一些孩子的标准情况.什么样的方法可以Lambdas帮助这个样板?

public List<ContextInfo> list() {
    final List<ContextInfo> list = new ArrayList<ContextInfo>();
    final StandardServer server = getServer();

    for (final Service service : server.findServices()) {
        if (service.getContainer() instanceof Engine) {
            final Engine engine = (Engine) service.getContainer();
            for (final Container possibleHost : engine.findChildren()) {
                if (possibleHost instanceof Host) {
                    final Host host = (Host) possibleHost;
                    for (final Container possibleContext : host.findChildren()) {
                        if (possibleContext instanceof Context) {
                            final Context context = (Context) possibleContext;
                            // copy to another object -- not …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

27
推荐指数
2
解决办法
2万
查看次数

RxJava 和 Retrofit 的单元测试

我有这个调用 Rest API 并将结果作为 Observable (Single) 返回的方法:

fun resetPassword(email: String): Single<ResetPassword> {
    return Single.create { emitter ->

        val subscription = mApiInterfacePanda.resetPassword(email)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe({ resetPasswordResponse ->
                when(resetPasswordResponse.code()) {
                    200 ->  {
                        resetPasswordResponse?.body()?.let { resetPassword ->
                            emitter.onSuccess(resetPassword)
                        }
                    }
                    else -> emitter.onError(Exception("Server Error"))
                }
            }, { throwable ->
                    emitter.onError(throwable)
            })

        mCompositeDisposable.add(subscription)

    }
}
Run Code Online (Sandbox Code Playgroud)

单元测试:

@Test
fun resetPassword_200() {
    val response = Response.success(200, sMockResetPasswordResponse)
    Mockito.`when`(mApiInterfacePanda.resetPassword(Mockito.anyString()))
        .thenReturn(Single.just(response))

    mTokenRepository.resetPassword(MOCK_EMAIL)

    val observer = mApiInterfacePanda.resetPassword(MOCK_EMAIL)
    val testObserver = TestObserver.create<Response<ResetPassword>>()
    observer.subscribe(testObserver)

    testObserver.assertSubscribed()
    testObserver.awaitCount(1)
    testObserver.assertComplete()
    testObserver.assertResult(response)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是只有这一行被覆盖,其他行不会运行,这对我的总测试覆盖率有很大影响: …

android unit-testing kotlin retrofit2 rx-java2

7
推荐指数
1
解决办法
298
查看次数

测试依赖项调用的lambda表达式

我试图测试lambda表达式中的一些代码,这是从另一个类的回调.

class EmailSender {
    private EmailBuilder emailBuilder;

    public void send() {
        String testEmail = emailBuilder.buildEmail("Test Email", bodyContentAppender());
        //send testEmail
    }

    private Consumer<Email> bodyContentAppender() {
        //how to test this through JUnit?
        return email -> email.appendBody("Body Content");
    }
}

interface EmailBuilder {

    String buildEmail(String templateName, Consumer<Email> contentAppender);
}
Run Code Online (Sandbox Code Playgroud)

getBodyContent调用方法中的lambda表达式是EmailBuilderJUnit测试中的模拟依赖项EmailSender.由于我在嘲笑行为EmailBuilder,因此getBodyContent不会从测试中调用内部代码.如何测试这样的作品?

编辑: 通过Argument Captors捕获lambda表达式在这种情况下不是解决方案,因为模拟行为EmailBuilder并且不调用实际方法.其次,email.appendBody对一个由外部API传递而不是直接创建的对象进行一些转换.

java lambda junit unit-testing java-8

6
推荐指数
1
解决办法
169
查看次数