繁体   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