Почему Log.d() ничего не печатает при запуске Android Local Unit Test?

Я пытаюсь напечатать что-то при запуске Android Local Unit Test, но ничего не происходит. В чем дело? Как я могу это исправить?

Я обратился к некоторым документам на 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();
        }

    });
}

}

Ответ 1

Вы должны использовать стандартный вывод, System.out.println("Hello Qaru") intead из Log.x(). Затем вы можете увидеть информацию журнала на вкладке запуска. enter image description here

2017/12/16 Обновление: если вы не видите вывод на вкладке Run, перейдите на вкладку Android Monitor, чтобы найти выход.

Ответ 2

Если вам нужно задействовать в своих тестах какой-либо код, связанный с Android (в котором находится Log.d), вы можете использовать платформу тестирования, такую ​​как Robolectric, которая предназначена для того, чтобы действовать как код Android.jar, который ссылается на ваш код, Путем настройки вашего тестового бегуна для запуска в Robolectric и установки правильного флага конфигурации в аннотациях robolectric config, вы можете включить ведение журнала с использованием методов ведения журнала.

Ответ 3

Я предлагаю вам использовать интерфейс:

interface PlatformLog {
    fun e(tag: String, msg: String, throwable: Throwable?=null)
    fun i(tag: String, msg: String)
}

создайте интерфейс, например:

в модульных тестах:

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")
    }
}

в андроиде

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)
                }
            }

Использование: В андроиде

private val log: PlatformLog = AndroidPlatformLog()

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

В тестах

private val log: PlatformLog = SystemPlatformLog()

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

ИЛИ с dagger2 в двух случаях:

@Inject lateinit var log: PlatformLog

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

в тестах

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)
}

Ответ 4

От Поддержка тестирования устройств:

Файл android.jar, который используется для запуска модульных тестов, не содержит никакого реального кода, который предоставляется изображением системы Android на реальных устройствах. Вместо этого все методы генерируют исключения (по умолчанию). Это делается для того, чтобы убедиться, что ваш модуль тестирует только ваш код и не зависит от какого-либо конкретного поведения платформы Android (что вы явно не издевались, например, с помощью Mockito). Если это окажется проблематичным, вы можете добавить фрагмент ниже к вашему build.gradle, чтобы изменить это поведение:

  android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}