android - 如何在 Robolectric 单元测试中断言 void 方法

标签 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 logEntry_test(){

    SampleClass sc = new SampleClass();
    sc.log();

    // What to assert here to verify this log method

}

最佳答案

首先,祝你编写测试顺利!有几种方法可以测试内部记录器的调用情况。 了解您要测试的内容同样重要。测试类是否正在记录特定消息很可能是 fragile test ,因此请预先警告您可能不需要它。

方法#1:使用 Robolectric

Roboctic 文档本身不适合回答基本问题,但其代码库及其测试记录得非常详细。基本了解其原理和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'

方法#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;
        }
    }
}

祝你好运,测试愉快!

关于android - 如何在 Robolectric 单元测试中断言 void 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40683196/

相关文章:

android - 使用 Robolectric 2 测试可序列化的包裹

java - 从 Gradle 启动时 Robolectric 自定义 TestRunner 不工作

android - android中的实时视频处理?就像在 Google I/O 2018 中一样。使用 openCV 可以达到什么帧速率>

android - 将外部 jar 添加到 Android UIautomator 项目

unit-testing - 单元测试 Dart 异步流

c# - resharper test runner - 如何按类别执行?

unit-testing - 哪些单元测试框架可用于 x86 汇编器?

android - Robolectric.setupActivity() 和 Robolectric.buildActivity() 有什么区别?

android - Android 5.0 如何延迟录屏?

android - (android)如何判断android热点中已连接设备的ip地址