gpt4 book ai didi

android - 在 android studio junit 测试中记录消息

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:18 28 4
gpt4 key购买 nike

有没有办法在 Android Studio 中运行 JUnit(方法)测试时打印出 Logcat(Log.i,Log.d)消息?

我可以看到 System.out.print 消息,但没有 logcat 打印输出。

在运行配置(Android Studio 的 GUI 窗口)中,有用于 Android 测试但不用于 JUnit 测试的 logcat 选项。

这有可能吗?感谢您的任何提示!

最佳答案

在单元测试中不会看到 Logcat 输出,因为 Logcat 是 Android 功能 - JUnit 测试只能使用标准 Java,因此 Android 功能将不起作用。

您在单元测试中可以做的是将“测试替身”注入(inject)测试组件。但是 Log.x 调用是静态的,所以您不能覆盖它们(如果不解决例如 PowerMock,您应该不惜一切代价避免)。

因此,第一步是引入一个非静态类,该类将充当 Log.x 调用的代理:

/**
* This class is a non-static logger
*/
public class Logger {

public void e(String tag, String message) {
Log.e(tag, message);
}

public void w(String tag, String message) {
Log.w(tag, message);
}

public void v(String tag, String message) {
Log.v(tag, message);
}

public void d(String tag, String message) {
Log.d(tag, message);
}
}

现在在每个调用 Log.x 的地方都使用这个类。

第二步是编写重定向到标准输出的 Logger 的测试替身实现:

public class UnitTestLogger extends Logger{

@Override
public void e(String tag, String message) {
System.out.println("E " + tag + ": " + message);
}

// similar for other methods
}

最后一步是在单元测试中注入(inject) UnitTestLogger 而不是 Logger:

@RunWith(MockitoJUnitRunner.class)
public class SomeClassTest {

private Logger mLogger = new UnitTestLogger();

private SomeClass SUT;

@Before
public void setup() throws Exception {
SUT = new SomeClass(/* other dependencies here */ mLogger);
}

}

如果你想对 OOP 概念严格严格,你可以提取 LoggerUnitTestLogger 的通用接口(interface)。

也就是说,我从未遇到过需要在单元测试中调查 Log.x 调用的情况。我怀疑你也不需要它。您可以在 Debug模式下运行单元测试并在调试器中逐行执行代码,这比尝试调查 logcat 输出要快得多...

一般建议:

如果您正在测试的代码包含 Log.x 静态调用并且您的单元测试没有崩溃 - 您就有问题了。

我猜要么所有测试都在使用 Robolectric 运行,要么你在 build.gradle 中有这个语句:unitTests.returnDefaultValues = true

如果您使用 Robolectric 运行所有测试,那么它只是效率低下,但如果所有 Android 调用都返回默认值,那么您测试套件是不可靠的。我建议您先解决此问题,然后再继续操作,因为它会在未来以某种方式对您产生不利影响。

关于android - 在 android studio junit 测试中记录消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35562238/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com