为什么Log.d()在运行Android Local Unit Test时什么都不打印?

Wil*_*ang 19 junit android unit-testing

我正在尝试在运行Android本地单元测试时打印一些东西,但没有发生任何事情.怎么了?我该如何解决?

我在http://developer.android.com上查阅了一些文档,发现Android Local Unit Test只在我的机器的JVM上运行,用于运行单元测试的android.jar文件不包含任何实际代码,所以Log. d()什么都不打印.如果我想打印日志,我该怎么办?

这是我的代码,FeedbackModelTest.java位于src/test/main目录中.

package com.upward.reader.mvp.model;

import android.util.Log;

import com.upward.reader.mvp.bean.FeedbackBean;
import com.upward.reader.net.RequestJSONCallback;

import org.junit.Test;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class FeedbackModelTest {

@Test
public void postFeedback() throws Exception {
    final String url = "http://test.guguread.com/interface/app/user/feedback?";
    Map<String, String> params = new HashMap<>();
    params.put("content", "content");
    new FeedbackModel().postFeedback(url, params, new RequestJSONCallback<FeedbackBean>() {

        @Override
        public void onResponse(FeedbackBean result) throws IOException {
            Log.d("TAG", result.toString());
        }

        @Override
        public void onFailure(Exception e) {
            e.printStackTrace();
        }

    });
}
Run Code Online (Sandbox Code Playgroud)

}

Jef*_* T. 40

你应该使用标准输出,System.out.println("Hello StackOverflow")intead Log.x().然后,您可以在运行选项卡中查看日志信息. 在此输入图像描述

2017/12/16更新:如果您无法在Run选项卡上看到输出,请转到 Android Monitor选项卡以查找输出.

  • 那很好笑.为什么不能用Log/Timber语句自动做一些魔术呢?我想知道吗? (2认同)

Nic*_*hek 5

我建议你使用接口:

interface PlatformLog {
    fun e(tag: String, msg: String, throwable: Throwable?=null)
    fun i(tag: String, msg: String)
}
Run Code Online (Sandbox Code Playgroud)

创建一个接口例如:

在单元测试中:

class SystemPlatformLog : PlatformLog {
    override fun i(tag: String, msg: String) {
        println("$tag : $msg")
    }

    override fun e(tag: String, msg: String, throwable: Throwable?) {
        println("$tag : $msg")
    }
}

Run Code Online (Sandbox Code Playgroud)

在安卓中

class AndroidPlatformLog : PlatformLog {
                override fun i(tag: String, msg: String) {
                    Log.i(tag, msg)
                }

                override fun e(tag: String, msg: String, throwable: Throwable?) {
                    Log.e(tag, msg, throwable)
                }
            }
Run Code Online (Sandbox Code Playgroud)

用途:在安卓中

private val log: PlatformLog = AndroidPlatformLog()

public override fun onCreate(savedInstanceState: Bundle?) {
    log.i(TAG, "onCreate $savedInstanceState")
}

Run Code Online (Sandbox Code Playgroud)

测试中

private val log: PlatformLog = SystemPlatformLog()

@Test
fun `should log in System`() {
    log.i(TAG, "called from tests")
}

Run Code Online (Sandbox Code Playgroud)

OR 与 dagger2 在两种情况下:

@Inject lateinit var log: PlatformLog

public override fun onCreate(savedInstanceState: Bundle?) {
    log.i(TAG, "onCreate $savedInstanceState")
}

Run Code Online (Sandbox Code Playgroud)

在测试中

class MyTest{

@Inject lateinit var log: PlatformLog

@Before
fun setUp() {
    val component = DaggerTestComponent.builder().testModule(TestModule()).build()
        component.inject(this)
}

@Test
fun `should log in System`() {
    log.i(TAG, "called from tests")
}
@Module
open class TestModule {

    @Provides
    @Singleton
    open fun providePlatformLog(): PlatformLog {
        return SystemPlatformLog()
    }
}
@Singleton
@Component(modules = [TestModule::class])
interface TestComponent {
    fun inject(test: MyTest)
}
Run Code Online (Sandbox Code Playgroud)