您好我请求您的帮助,以了解如何模拟班级Validator.validateConnection();
的方法。
问题是方法validateConnection
不存在于类Class_Implementation
中,我不想在类Class_Implementation
中创建该方法。方法validateConnection
与数据库建立连接以了解连接是否处于活动状态。当Mockito运行时,我得到一个由java.Lang.NullPointerException
引起的NamingException
- 需要在环境中指定类名。
真正的问题是当我打电话给Mockito测试线时:
Boolean resp = mockImpl.checkConnection();
.. checkConnection()
类Validator.validateConnection();
正在尝试连接数据库。我只想模拟这一行并返回true
或false
,但问题是方法validateConnection()
是类Validator
的一个实例。
如果需要更多信息来解决这个问题,请告诉我。
public class Class_Implementation {
public boolean checkConnection() {
boolean isConnectionAlive = false;
Validator.validateConnection();
// another things for do
return false;
}
}
public class Validator {
public static Boolean validateConnection() {
Connection conn = new Connection();
Boolean connectionAlive = false;
connectionAlive = conn.isConnectionAlive();
if (connectionAlive) {
return true;
} else {
return false;
}
}
}
public class Connection {
public boolean isConnectionAlive() {
// Code for connection to DB
}
}
// class for do the test
@RunWith(PowerMockRunner.class)
@PrepareForTest({Class_Implementation.class,Validator.class})
public class TestConnection {
@Test
public void validate_Connection() throws Exception {
Class_Implementation mockImpl = PowerMock.createPartialMock(Class_Implementation.class);
PowerMock.mockStatic(Validator.class);
PowerMockito.when(mockImpl, Validator.validateConnection() ).thenReturn(true);
PowerMock.replayAll(mockImpl);
Boolean resp = mockImpl.checkConnection();
PowerMock.verifyAll();
Validate.notNull(resp);
}
}
答案 0 :(得分:1)
使用Validator对象而不是静态方法,并将Validator注入Class_Implementation(通过构造函数)。这称为Dependency Injection。在您的测试中,您可以注入验证器的模拟。
public class Validator {
public boolean validateConnection() {
...
}
}
public class Class_Implementation {
private final Validator validator;
public Class_Implementation(Validator validator) {
this.validator = validator;
}
public boolean checkConnection() {
...
validator.validateConnection();
...
}
}
public public class Class_ImplementationTest {
@Test
public void validate_Connection() throws Exception {
Validator validator = Mockito.mock(Validator.class);
Mockito.when(validator.validateConnection()).thenReturn(true);
Class_Implementation impl = new Class_Implementation(validator);
boolean response = mockImpl.checkConnection();
Assert.assertTrue(response);
}
}
我对您的代码进行了一些其他更改。
答案 1 :(得分:0)
只是嘲笑你的Class_Implementation
(你应该更改名称并坚持使用Java命名标准)并存根validateConnection()
方法:
final Class_Implementation mock = mock(Class_Implementation.class);
when(mock.checkConnection()).thenReturn(true); // or false
但无论如何,你应该模仿的是开始的界面。