如何在机器人电气单元测试中断言一个void方法



如何验证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:使用robolelectric

Robolectic文档不适合回答基本问题,但它的代码库与测试一起记录得很好。对它的原理和影子如何工作的基本了解可以让你走很长的路。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完成。

最新更新