如何验证robolelectric测试用例中没有数据输出的void方法调用。
在这种情况下断言什么?下面给出了一个需求的例子。
public class SampleClass(){
final String TAG = SampleClass.class.getSimpleName();
public void log(){
Log.d(TAG, "Entry Loggd");
}
}
@Test
public void logEntry_test(){
SampleClass sc = new SampleClass();
sc.log();
// What to assert here to verify this log method
}
首先,很高兴您编写了测试!有几种方法可以测试是否调用了内部日志记录器。理解要测试的内容同样重要。测试一个类正在记录一个特定的消息很可能是一个脆弱的测试,所以要预先警告,你可能不需要它。
方法#1:使用robolelectricRobolectic文档不适合回答基本问题,但它的代码库与测试一起记录得很好。对它的原理和影子如何工作的基本了解可以让你走很长的路。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");
// or
assertThat(lastLog.msg).isNotNull();
}
}
使用robolelectric v3.1.2的测试将以下内容添加到build.gradle
文件中:
testCompile 'org.robolectric:robolectric:3.1.2'
方法#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");
}
}
// SampleClassTest.java
public class SampleClassTest {
// setting up a Tree instance that we define below
TestTree testTree = new TestTree();
@Test
public void log_writesExpectedMessage() {
// setting up Timber to us the test classes log writer
Timber.plant(testTree);
// invoke the logging function
new SampleClass().log();
// assert
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;
}
}
}
祝好运,测试愉快!
在我的理解中你想模拟静态方法。我想,使用静态模拟并不是最优雅的测试方式。最好使用abest推荐的抽象。不过,它可以用PowerMock完成。