Как выполнить юнит-тестирование следующей блокировки и многопоточного кода

У меня есть следующий метод записи, который записывает данные в файл с помощью 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();
        }
      }

Показанная выше блокировка - это блокировка Reeentrant, предоставляемая библиотеками Java. Если я хочу провести модульное тестирование вышеуказанного метода для обеспечения безопасности потока, как это проверить?

Пожалуйста, порекомендуйте,

Спасибо!

1 ответ

Если вы вводите либо Writer или Gson объект, вы можете предоставить имитацию реализации. Если вы издеваетесь над писателем, сделайте write методы блокируют, чтобы они не заканчивали и не снимали блокировку. Сделай это в одной теме. В другой позвони write метод снова. Наконец, в вашем "основном" тестовом потоке вращайте, пока состояние заблокированного потока не станет Thread.State.BLOCKED, Если он никогда не блокируется или заканчивается, вы терпите неудачу. Как только вы увидите, что он заблокирован, освободите первый поток (CountDownLatch это хорошо), и убедитесь, что оба потока заканчиваются.

Другие вопросы по тегам