【发布时间】:2015-06-28 00:49:02
【问题描述】:
我有以下使用 gson 将数据写入文件的写入方法。
private static final File CONFIG_FILE = new File("./config.json");;
private static final ReadWriteLock READ_WRITE_LOCK = new ReentrantReadWriteLock(true);
private static final Lock READ_LOCK = READ_WRITE_LOCK.readLock();
private static final Lock WRITE_LOCK = READ_WRITE_LOCK.writeLock();
...
public void write(JsonData data) {
Verifier.verifyNotNull(data,"data : null");
Verifier.verifyNotNull(data.getData(),"JsonData data : null");
Verifier.verifyNotEmpty(data.getIdentifier(),"JsonData identifier : empty");
Writer writer = null;
Gson gson = null;
try {
WRITE_LOCK.lock();
writer = new FileWriter(CONFIG_FILE);
gson = new GsonBuilder().setPrettyPrinting().create();
gson.toJson(data, writer);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if (writer != null) {
writer.flush();
writer.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
WRITE_LOCK.unlock();
}
}
上面显示的锁是Java库提供的可重入锁。如果我想对上述线程安全方法进行单元测试,如何测试呢?
请指教,
谢谢!
【问题讨论】:
-
为此您需要多个尝试块。如果
writer.flush()抛出异常,你不会释放锁。 -
您好,感谢您的关注。我将“writer.flush()”移到了 catch 块。由于“.flush”和“.close”方法都抛出“IOExceptions”,我认为锁定将在上面显示的“IOException”的 catch 块中释放。编辑代码
-
尝试嵌套你的 try 块,这样你的外部块就只用于锁。这避免了不得不在不同的地方调用 unlock 或对
flush()中的错误感到惊讶,抛出您错过的RuntimeException。 -
如果我只是将释放锁移动到 finally 块怎么样。然后在上面的代码中为 close 和 flush 捕获 IOException 和 RuntimeException(无需嵌套 try-catch)。编辑了代码。这行得通吗?
-
如果你没有说明代码的规范,没有人可以建议如何测试代码是否符合规范。
标签: java multithreading unit-testing jmock