如何在构造函数中模拟创建与HBase的连接?

时间:2017-05-16 13:47:53

标签: unit-testing junit hbase mockito powermock

我正在尝试设置我的单元测试,以便我可以测试我的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)

0 个答案:

没有答案