簡體   English   中英

如何在 Robolectric 單元測試中斷言 void 方法

[英]How to assertion a void method in Robolectric Unit Test

如何在 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

}

首先,祝你寫測試好!!! 有幾種方法可以測試調用內部記錄器。 了解您要測試的內容同樣重要 測試一個類正在記錄一條特定的消息很可能是一個脆弱的測試,所以預先警告你可能不需要它。

方法#1:使用Robolectric

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();
    }
}

使用 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;
        }
    }
}

祝你好運,測試愉快!

據我了解,您想模擬靜態方法。 我想,使用靜態模擬並不是最優雅的測試方式。 最好使用abest推薦的抽象。 雖然,它可以用PowerMock來完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM