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

时间:2017-07-27 20:52:05

标签: java unit-testing mockito powermock 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");
    }
}

I类测试如下:

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) {
        ...
    }
}

我跟随How to mock non static methods using PowerMockCan Powermockito mock final method in non-final concrete class?。我尝试了一些变体,例如使用Mockito而不是PowerMock来存根authUser,并将APIClientConnection.class添加到PrepareForTest注释中。我无法弄清楚为什么它不起作用。我做错了什么?

2 个答案:

答案 0 :(得分:2)

你的问题在这里

str.split()

您指示当用户使用凭据PowerMockito.when(connectionMock.authUser("user", "password")).thenReturn("random string"); c.apiConnect("fake-host", 80, "fake-user", "fake-password"); 进行日志记录时应该存根该方法,但您要发送user/password

用最后一行替换 fake-user/fake-password

答案 1 :(得分:1)

操作员错误:X

由于我在发布之前对代码进行了清理,因此我有两个错别字。在上面用户指出的错误中,存根中的参数和传递给实际方法调用的参数不匹配。这不是导致我的问题,因为当我在帖子中输入错字时引入了错字,并且没有反映在我正在运行的代码中。

第二个错字实际上是导致我的问题。我的实际代码是使用:

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

我以某种方式设法在我的帖子中变成了这个:

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

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

向任何一直盯着这个想知道发生了什么事的人道歉!我猜我已经盯着它看了太久。上面的代码应该有用,也许对某人有帮助。