如何在Robolectric单元测试中断言空方法

时间:2016-11-18 17:52:17

标签: 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

}

2 个答案:

答案 0 :(得分:2)

首先,擅长编写测试!有几种方法可以测试内部记录器的调用方式。同样重要的是了解您正在测试的内容。测试某个类正在记录特定消息的行为很可能是fragile test,因此请事先做好准备。警告你可能不需要它。

方法#1:使用Robolectric

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'

方法#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)

据我了解,您想模拟静态方法。我猜想,使用静态模拟并不是最优雅的测试方法。最好使用abest建议的抽象。虽然可以使用PowerMock完成。