Как выполнить юнит-тестирование следующей блокировки и многопоточного кода
У меня есть следующий метод записи, который записывает данные в файл с помощью 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
это хорошо), и убедитесь, что оба потока заканчиваются.