簡體   English   中英

我如何對以下鎖和多線程代碼進行單元測試

[英]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鎖。 如果要對線程安全性的上述方法進行單元測試,如何對其進行測試?

請指教,

謝謝!

如果注入WriterGson對象,則可以提供模擬實現。 如果模擬寫程序,則使write方法成為塊,這樣它們就不會完成並釋放鎖。 在一個線程中做到這一點。 在另一個方法中,再次調用您的 write方法。 最后,在“主”測試線程中,旋轉直到阻塞線程的狀態為Thread.State.BLOCKED 如果它從未被阻止或完成,那么您將失敗。 一旦看到它被阻止,就釋放第一個線程( CountDownLatch對此很有用),並驗證兩個線程都完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM