我正在尝试设置我的单元测试,以便我可以测试我的HBase客户端。但是,我无法在构造函数中模拟与HBase的连接的创建。我不认为我正确地将模拟连接注入到我想测试的课程中,但我不确定我在哪里犯了错误。我已经查看了关于模拟连接的类似问题,但所有这些问题都在构造函数之外创建了连接。
这是我要测试的代码:
@Lazy
@Service("HBaseClient")
public class HBaseClient {
/**
* Instantiate a new client and create connection to HBase.
*/
public HBaseClient() {
// Create connection to HBase
conf = HBaseConfiguration.create();
conf.setInt("timeout", 120000);
conf.set("hbase.zookeeper.quorum", zookeeperHost);
conf.set("hbase.zookeeper.property.clientPort", zookeeperPort);
conf.set("zookeeper.znode.parent", znodeParent);
try {
connection = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
logger.error("Error creating connection to HBase - IOException");
}
}
public void addRecord(String rowKey, String columnFamily, Map<String, String> values) {
...
以下是我在单元测试中所拥有的内容:
@RunWith(PowerMockRunner.class)
public class TestHBaseClient {
@InjectMocks
private static HBaseClient hbaseClient;
@BeforeClass
@PrepareForTest({ConnectionFactory.class})
public static void setUpBeforeClass() throws Exception {
Connection mockConnection = PowerMockito.mock(Connection.class);
PowerMockito.mockStatic(ConnectionFactory.class);
PowerMockito.when(ConnectionFactory.createConnection()).thenReturn(mockConnection);
hbaseClient = new HBaseClient();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Test
public void testAddRecord() {
HashMap<String, String> values = new HashMap<String, String>();
values.put("test1", "abc");
values.put("test2", "xyz");
hbaseClient.addRecord("test", "Test", values);
}
}
目前的代码会引发以下错误:
org.mockito.exceptions.misusing.MissingMethodInvocationException: when()需要一个参数,该参数必须是模拟&#39;上的方法调用。 例如: 当(mock.getArticles())thenReturn(文章);
此外,此错误可能会显示,因为: 1.你存在以下任何一个:final / private / equals()/ hashCode()方法。这些方法无法进行存根/验证。 2.在()内部,你不会在模拟上调用方法,而是在某些其他对象上调用方法。 3.模拟类的父母不公开。这是模拟引擎的限制。
at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:495) 在 com.rtn.cdp.storage.hbase.test.TestHBaseDataClient.setUpBeforeClass(TestHBaseClient.java:32) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)at org.junit.internal.runners.ClassRoadie.runBefores(ClassRoadie.java:56) 在 org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:43) 在 org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) 在 org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:101) 在 org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 在 org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)