我在最后一种方法上遇到了麻烦,这种方法在我试图测试的类中使用。我的测试类中有问题的行在这里:
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 PowerMock和Can Powermockito mock final method in non-final concrete class?。我尝试了一些变体,例如使用Mockito而不是PowerMock来存根authUser,并将APIClientConnection.class添加到PrepareForTest注释中。我无法弄清楚为什么它不起作用。我做错了什么?
答案 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”后,它就开始工作了。所以我设法在发布我自己的问题的同时介绍了修复程序。 :/
向任何一直盯着这个想知道发生了什么事的人道歉!我猜我已经盯着它看了太久。上面的代码应该有用,也许对某人有帮助。