使用Mockito对Abstract类中的一个静态方法进行嘲讽。

问题描述 投票:0回答:1
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为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:

删除了静态方法。而且仍然无法模拟getConnection()方法来返回被模拟的连接。

编辑2:将URL对象移到getConnection方法中。

将URL对象移至getConnection方法,以避免制作一个新的URL,这样我就可以模拟它,并为此在测试中做了修改。依然可以接收到实时值。

java mockito httpurlconnection junit5 java-11
1个回答
0
投票

似乎应该有这样的东西

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

0
投票

静态方法不能直接被嘲讽,要嘲讽静态方法,你需要在Mockito之上使用PowerMock。

还有一个选择是使用Jmockit框架。这可以代替使用两个框架(Mockito和PowerMock)。

这里是参考资料,为什么静态方法的嘲讽不能与Mockito一起工作----------。

使用Mockito对静态方法进行模拟.

[更新]:关于连接的模拟问题。

而不是


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

试用


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

如果你不想通过 任何,替代方法可以是嘲讽URL类和方法。打开连接 也是。

© www.soinside.com 2019 - 2024. All rights reserved.