首先,写测试是非常好的!有几种方法可以测试内部记录器是否被调用。同样重要的是
了解您要测试什么。测试类是否记录特定消息很可能是
脆弱的测试,因此请预先警告您可能不需要它。
方法#1:使用Robolectric
Robolectic文档不适合回答基本问题,但其代码库非常好地记录了其测试。对其原理和
影子工作原理有基本的了解可以帮助您走得更远。
ShadowLog测试为此解决方案奠定了基础。
@RunWith(RobolectricTestRunner.class)
public class SampleClassTest {
@Test
public void log_writesExpectedMessage() {
new SampleClass().log();
ShadowLog.LogItem lastLog = ShadowLog.getLogs().get(0);
assertThat(lastLog.msg).isEqualTo("some message");
assertThat(lastLog.msg).isNotNull();
}
}
使用 Robolectric v3.1.2 进行测试
将以下内容添加到您的 build.gradle
文件中:
testCompile 'org.robolectric:robolectric:3.1.2'
方法二:利用抽象化
如果你的示例类继承自 Android 类(Activity、Fragment、Application 等),那么使用 android.util.Log
是有意义的,但请注意你的测试需要是 Robolectric 或 AndroidInstrumented 测试。如果你的 SampleClass
只是一些 POJO,那么使用一个简单的日志框架可能会让你的测试工作更容易。例如,使用 Jake Wharton 的 Timber,你可以编写如下的类和测试:
import timber.log.Timber;
public class SampleClass {
void log() {
Timber.d("some message");
}
}
public class SampleClassTest {
TestTree testTree = new TestTree();
@Test
public void log_writesExpectedMessage() {
Timber.plant(testTree);
new SampleClass().log();
assertThat(testTree.lastMessage).isEqualTo("some message");
}
private class TestTree extends Timber.Tree {
private String lastMessage;
@Override
protected void log(int priority, String tag, String message, Throwable t) {
lastMessage = message;
}
}
}
祝你好运,测试愉快!