我如何对以下锁和多线程代码进行单元测试

时间:2015-06-27 14:51:25

标签: java multithreading unit-testing jmock

我有以下写入方法,使用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库提供的Reeentrant锁。如果我想对上面的线程安全方法进行单元测试,请如何测试呢?

请指教,

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您注入WriterGson对象,则可以提供模拟实现。如果您嘲笑作者,请使write方法阻止,以便他们不会完成并释放锁定。在一个线程中执行此操作。在另一个方法中,再次调用您的 write方法。最后,在你的" main"测试线程,旋转直到阻塞线程的状态为Thread.State.BLOCKED。如果它从未被阻止或完成,你就会失败。一旦你看到它被阻止,释放第一个线程(CountDownLatch对此有好处),并验证两个线程是否完成。