簡體   English   中英

Mocking a static 抽象 class 中的方法使用 Z4D1142CA816EAC3E33B383BC0B79B537

[英]Mocking a static Method in Abstract class using Mockito

public abstract class A {

    public String method1( String urlString ) {
        HTTP HttpURLConnection con = getConnection(url);

        .... I use con.getInpurStream() to get the data and return it...

    }
    public HttpURLConnection getConnection(URL url) {
        URL url = new URL(urlString);
        return (HttpURLConnection) url.openConnection();
    }
}


public class B extends A {
    public String method2(String urlString) {
        return method1(urlString);
    }
}

我正在嘗試使用 JUNIT 和 Mockito 為 Class B 方法 2 編寫單元測試。

我厭倦了這樣的事情:

public class testB {
    String urlString = "someValid.url";
    String dummyRes = "dummy Response";
    InputStream res = new ByteArrayInputStream(dummyRes.getBytes());

    B mockB = Mockito.mock(B.class);
    HttpURLConnection connection = Mockito.mock(HttpURLConnection.class);
    Mockito.when(connection.getInputStream()).thenReturn(res);
    Mockito.when(mockB.getConnection(urlString)).thenRetrun(connection);

    assertEquals("dummy Response", mockB.method2("someValid.url");

}

我不斷從 url 而不是 dummyRes 獲取實時數據。

請幫忙 /\

編輯1:

刪除了 static 方法。 而且我仍然無法模擬 getConnection() 方法來返回模擬的連接。

編輯2:

將制作 URL object 移動到 getConnection 方法以避免制作新的 URL 以便我可以模擬它並在測試中進行更改。 仍在獲取實時值。

好像應該有這樣的東西

Mockito.when(mockB.getConnection(Mockito.eq("someValid.url" ))).thenReturn(connection);

不能直接模擬 static 方法,對於 mocking static 方法,您需要在 Z935D1142CAEBBEA77 之上使用 PowerMock。

另一種選擇可能是使用 Jmockit 框架。 這可以用來代替使用兩個框架(Mockito 和 PowerMock)。

這是參考,為什么 static 方法的 mocking 不適用於 Mockito -

Mocking static 方法與 Mockito

[更新]:對於連接的模擬問題,

代替


    Mockito.when(mockB.getConnection(tempURL)).thenRetrun(connection);

嘗試使用


    Mockito.when(mockB.getConnection(any())).thenRetrun(connection);

如果您不想通過任何方法,則可以選擇 mocking URL class 以及openConnection方法。

暫無
暫無

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

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