概述
使用curator framework框架去操作zookeeper時,我們知道因其的方法風格是那種流式的編寫風格,所以我們在寫單元測試的時候要把鏈接zookeeper的操作給mock掉,那么著實是不太好寫單測。不過好在curator framework有一個專門用于測試的模塊,可以讓我們在單測運行之前就在本地啟動一個zookeeper server實例,以便于讓單測可以直接連接本地的zookeeper實例創建curator client,便于做單元測試。
實現
引入依賴
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>4.3.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-test</artifactId><version>4.3.0</version><scope>test</scope></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.14</version></dependency>
啟動zookeeper
private static TestingServer zkServer;@BeforeClasspublic static void startZkServer() throws Exception {zkServer = new TestingServer(true);zkServer.start();}
創建curator framework client
private CuratorFramework zkClient;@BeforeAllpublic CuratorFramework createCuratorClient() {zkClient = CuratorFrameworkFactory.builder()//本地啟動的zookeeper實例端口,跑單測用.connectString(zkServer.getConnectString()).retryPolicy(new RetryNTimes(5, 1000)).connectionTimeoutMs(40 * 1000).sessionTimeoutMs(5 * 1000).build();zkClient.start();}
單元測試-創建臨時節點
@Testpublic void test_createEphemeral() {String path = "/zk/test";createEphemeral(path);List<String> childrens = getChildren("/zk");Assert.assertEquals(1, childrens.size());}private void createEphemeral(String path) {try {zkClient.create().withMode(CreateMode.EPHEMERAL).forPath(path);} catch (NodeExistsException e) {logger.warn("ZNode " + path + " already exists.", e);throw new IllegalStateException(e.getMessage(), e);} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);}}private List<String> getChildren(String path) {try {return zkClient.getChildren().forPath(path);} catch (NoNodeException e) {return new ArrayList<>();} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);}}
單測完畢后關閉zookeeper server
@AfterClass
public static void closeZkServer() throws IOException {zkServer.close();
}