单元测试时如何使用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服务器,在测试函数结束后关闭这个服务器。

posted @ 2020-10-28 20:36  ralgo  阅读(577)  评论(0)    收藏  举报