[英]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.