如何验证Robolectric测试案例中的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
}
答案 0 :(得分:2)
首先,擅长编写测试!有几种方法可以测试内部记录器的调用方式。同样重要的是了解您正在测试的内容。测试某个类正在记录特定消息的行为很可能是fragile test,因此请事先做好准备。警告你可能不需要它。
Robolectic文档并不适用于回答基本问题,但其代码库的测试记录非常详细。对其原则的基本理解和how shadows work可以帮助您走很长的路。 ShadowLog tests为这个解决方案奠定了基础。
@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();
}
}
使用Robolectric v3.1.2进行测试
将以下内容添加到build.gradle
文件中:
testCompile 'org.robolectric:robolectric:3.1.2'
如果您的示例类派生自Android类(Activity,Fragment,Application等),那么使用android.util.Log
是有意义的,但请记住,您的测试需要是Robolectric或AndroidInstrumentation测试。如果您的SampleClass
只是一些POJO,那么使用简单的日志记录框架可以使您的测试工作更轻松。例如,使用杰克沃顿的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;
}
}
}
祝你好运,快乐的测试!
答案 1 :(得分:0)