Android 如何在机器人分子单元测试中断言void方法
如何在Robolectric测试用例中验证void方法调用,因为没有数据来自被调用的方法 在这种情况下应该主张什么?下面给出了一个需求示例Android 如何在机器人分子单元测试中断言void方法,android,unit-testing,robolectric,android-testing,Android,Unit Testing,Robolectric,Android Testing,如何在Robolectric测试用例中验证void方法调用,因为没有数据来自被调用的方法 在这种情况下应该主张什么?下面给出了一个需求示例 public class SampleClass(){ final String TAG = SampleClass.class.getSimpleName(); public void log(){ Log.d(TAG, "Entry Loggd"); } } @Test public void logEnt
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:使用机器人分子 Robolectic文档不适合回答基本问题,但它的代码库在测试中有很好的文档记录。对它的原理有一个基本的了解,可以让你走很长的路。为这一解决方案奠定基础
@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'
方法#2:利用抽象
如果您的示例类派生自Android类(活动、片段、应用程序等),那么使用Android.util.Log
是有意义的,但请记住,您的测试将需要是一个机器人分子测试或AndroidInstrumented测试。如果您的SampleClass
只是一些POJO,那么使用一个简单的日志框架可能会使您的测试工作更容易。例如,使用Jake Wharton的,您的类和测试可以编写如下:
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;
}
}
}
祝你好运,考试愉快 据我所知,您想要模拟静态方法。我想,使用静态模拟并不是最优雅的测试方式。最好使用由推荐的抽象。虽然,它可以用 听起来OP只是给出了一个作为MCVE登录的方法,而不是显式地尝试测试日志消息。我现在正在寻找类似的东西-如何验证void方法的调用是否与mockitoverifyonmocks类似?您试图断言什么?日志消息?是否调用了Log.d()方法?log()方法执行时是否没有异常?