单元测试时如何使用ZooKeeper
当我们开发的代码依赖ZooKeeper时,该如何在单元测试中启动ZooKeeper?
首先需要确认zookeeper的lib是否在类路径中,我使用的是Maven,首先在POM文件中引入依赖:
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
接着定义一个类:
public class EmbeddedZookeeper {
final String connectString;
File snapshotDir;
File logDir;
ZooKeeperServer zookeeper;
NIOServerCnxn.Factory factory;
public ZkClient client;
public EmbeddedZookeeper(String connectString) {
try {
this.connectString = connectString;
snapshotDir = TestUtils.tempDir(); //为zk的Snapshot创建一个临时文件夹
logDir = TestUtils.tempDir(); //为zk的Log创建一个临时文件夹
zookeeper = new ZooKeeperServer(snapshotDir, logDir, 3000);
int port = Integer.valueOf(connectString.split(":")[1]);
factory = new NIOServerCnxn.Factory(new InetSocketAddress("127.0.0.1", port));
factory.startup(zookeeper);
//client = new ZkClient(connectString);
//client.setZkSerializer(ZKStringSerializer.getInstance());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public void shutdown() {
factory.shutdown();
//client.close();
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Utils.rm(logDir);
Utils.rm(snapshotDir);
}
}
再接着就是编写单元测试了:
public class ZKTest {
EmbeddedZookeeper zkServer;
@Before
public void setUp() {
zkServer = new EmbeddedZookeeper("127.0.0.1:2181");
}
@After
public void tearDown() {
zkServer.shutdown();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
...
}
上面这段代码会在每一个测试函数开始前启动一个zookeeper服务器,在测试函数结束后关闭这个服务器。

浙公网安备 33010602011771号