[英]How do i unit test the following lock and multi-threaded code
我有以下使用gson將數據寫入文件的write方法。
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庫提供的Reeentrant鎖。 如果要對線程安全性的上述方法進行單元測試,如何對其進行測試?
請指教,
謝謝!
如果注入Writer
或Gson
對象,則可以提供模擬實現。 如果模擬寫程序,則使write
方法成為塊,這樣它們就不會完成並釋放鎖。 在一個線程中做到這一點。 在另一個方法中,再次調用您的 write
方法。 最后,在“主”測試線程中,旋轉直到阻塞線程的狀態為Thread.State.BLOCKED
。 如果它從未被阻止或完成,那么您將失敗。 一旦看到它被阻止,就釋放第一個線程( CountDownLatch
對此很有用),並驗證兩個線程都完成了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.