簡體   English   中英

驗證對靜態方法的調用

[英]Verify call to static method

我想驗證是否調用 public static void方法。

@RunWith(PowerMockRunner.class)
@PrepareForTest({ConsoleLog.class})
public class AdContentDataUnitTest {

    @Before
    public void setUp() throws Exception {
        PowerMockito.mockStatic(ConsoleLog.class);
    }

    @Test
    public void adContentData_sendTrackingEvent_noUrl() throws Exception {
        mAdContentData = spy(mAdContentData);

        // PowerMockito.doNothing().when(ConsoleLog.class);

        verifyStatic();
        mAdContentData.sendTrackingEvent("event1");
        //verifyStatic();
    }
}

將調用sendTrackingEvent並將調用ConsoleLog.v(String, String) 我可以在調試中看到調用靜態方法,但出現以下日志並且測試失敗:

Wanted but not invoked com.example.logger.ConsoleLog.v(
    "AdContentData",
    "sendTrackingEvent: event event1 does not exist."
);

我嘗試在相同的日志之后添加verifyStatic ,如果我刪除第一個驗證,則不會檢查任何內容。 如果我模擬整個ConsoleLog類, Unfinished stubbing detected here: [...] PowerMockitoCore.doAnswer錯誤Unfinished stubbing detected here: [...] PowerMockitoCore.doAnswer

有誰知道如何正確地做到這一點?

有誰知道如何正確地做到這一點?

是。 根本不要這樣做。

假設您有一個類調用靜態方法,如下所示:

class Person {
    private final int id;

    Person() {
        id = IdGenerator.gen();
    }
}

將靜態調用解壓縮為非靜態方法:

class Person {
    private final int id;

    Person() {
        id = generateId();
    }

    protected int generateId() {
        return IdGenerator.gen();
    }
}

現在您可以編寫測試,覆蓋提取的方法:

    final int id = 1;
    Person person = new Person() {
        @Override
        protected int generateId() {
            return id;
        }
    };

    // test with person, knowing we control id

但理想的解決方案實際上是重構被測試的代碼,根本不使用這種靜態調用,而是依賴注入。

暫無
暫無

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

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