当前位置: 首页 > 知识库问答 >
问题:

用PowerMockito在内部类中模拟final方法

凌嘉勋
2023-03-14
PowerMockito.when(connectionMock.authUser("fake-user", "fake-password")).thenReturn("random string");
@RunWith(PowerMockRunner.class)
@PrepareForTest({MyClass.class, APIClientConnection.class})
public class MyClassTest {
    @Test
    public void apiConnect() throws Exception {
        MyClass c = new MyClass();
        APIClientConnection connectionMock = PowerMockito.mock(APIClientConnection.class);
        PowerMockito.whenNew(APIClientConnection.class).withAnyArguments().thenReturn(connectionMock);
        PowerMockito.when(connectionMock.authUser("fake-user", "fake-password")).thenReturn("random string");
        c.apiConnect("fake-host", 80, "fake-user", "fake-password");
    }
}
public class MyClass {
    public MyClass() { }
    public APIClientConnection apiConnect(String host, int port, String user, String pass) {
            conn = new APIClientConnection(host, port);
            conn.authUser(user, pass);
    }
}

其中authUser()定义为final,如下所示:

public class APIClientConnection {
    public final String authUser(String username, String password) {
        ...
    }
}

我正在学习如何使用PowerMock模拟非静态方法,以及Powermockito是否可以模拟非final具体类中的final方法?。我尝试了一些变体,例如使用Mockito而不是PowerMock来存根authUser,以及将apiclientconnection.class添加到PrepareForTest注释中。我不明白为什么它不起作用。我做错了什么?

共有1个答案

咸亦
2023-03-14

你的问题就在这里

PowerMockito.when(connectionMock.authUser("user", "password")).thenReturn("random string");
c.apiConnect("fake-host", 80, "fake-user", "fake-password");

您指示,当用户使用凭据user/password登录时,应该停止该方法,但您发送的是fake-user/fake-password

将最后一行替换为c.apiconnect(“fake-host”,80,“user”,“password”);

 类似资料:
  • 我目前正试图模拟类中的私有final static对象。我的目标似乎没有被恰当地模仿。 示例: 代码:在主类中 嘲笑:在我的测试课上,我有 但是obj不返回我在执行时指定的值 并将实际运行。 任何建议都将是有帮助的,我也不能改变Main类中的任何代码,谢谢。

  • 我试图使用PowerMockito在我正在测试的代码中模拟java.net.URL类的创建。基本上,我希望防止真正的HTTP请求发生,而是1)在请求发出时检查数据,2)在模拟响应中提供我自己的测试数据。这就是我正在尝试的: 我要测试的代码如下所示: 在前面的测试场景中,我模拟了wlInvokeUrlString以匹配“MyURLString”。我还尝试使用whenNew行的各种其他形式,尝试注入模

  • 我试图在测试的类中模拟一个私有方法,如下所示。 现在我需要测试方法和mock。 我尝试创建间谍的上述类,但该方法得到调用时,我这样做下面 在第二行本身被调用。而且,不会被模仿。 也许我用错误的方式创建了间谍对象?无法执行