繁体   English   中英

使用PowerMockito在内部类中模拟最终方法

[英]Mock final method in inner class with PowerMockito

我在使用最终方法时遇到麻烦,该方法在我要测试的类中使用。 我的测试班中有问题的一行在这里:

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

引发NullPointerException。 我的测试课看起来像这样:

@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()被最终定义为:

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

我跟着如何使用PowerMock模拟非静态方法,以及Powermockito可以模拟非最终具体类中的final方法吗? 我尝试了一些变体,例如使用Mockito代替PowerMock来对authUser进行存根,并将APIClientConnection.class添加到PrepareForTest批注中。 我不知道为什么它不起作用。 我究竟做错了什么?

你的问题在这里

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");替换最后一行c.apiConnect("fake-host", 80, "user", "password");

操作员错误:X

由于在发布之前对代码进行了清理,因此我有两次错别字。 在上述用户指出的错误中,存根中的参数与传递给实际方法调用的参数不匹配。 这不是引起我的问​​题的原因,因为打字错误是在我将其输入到帖子中时引入的,并且没有反映在我运行的代码中。

第二个错别字实际上是造成我的问题的原因。 我的实际代码正在使用:

APIClientConnection conn = Mockito.mock(APIClientConnection.class);

我以某种方式设法在我的帖子中将其转换为:

APIClientConnection conn = PowerMockito.mock(APIClientConnection.class);

一旦我在代码中将“ Mockito.mock”切换为“ PowerMockito.mock”,它便开始工作。 所以我设法在发布自己的问题时介绍了此修复程序。 :/

向一直在想知道发生了什么的任何人致以诚挚的歉意! 我猜我盯着它太久了。 上面的代码应该可以工作,也许会对某人有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM