Я создаю библиотеку Java. Некоторые из классов, которые предназначены для использования пользователями библиотеки, содержат собственные системные ресурсы (через JNI). Я хотел бы убедиться, что пользователь "удаляет" эти объекты, так как они тяжелые, и в тестовом наборе они могут вызвать утечку между тестовыми сценариями (например, мне нужно убедиться, что TearDown
утилизирует). Для этого я заставил классы Java реализовать AutoCloseable, но этого недостаточно, или я не правильно его использую:
-
Я не вижу, как использовать оператор
try-with-resources
в контексте тестов (я используюJUnit5
сMockito
), поскольку "ресурс" не является недолговечным - он является частью тестового набора. -
Будучи старательным, как всегда, я пытался реализовать
finalize()
и тестировать на закрытие, но оказывается, чтоfinalize()
даже не вызывается (Java10). Это также помечено как устаревшее, и я уверен, что эта идея будет осуждена.
Как это сделать? Чтобы было ясно, я хочу, чтобы тесты приложений (которые используют мою библиотеку) не выполнялись, если они не вызывали close()
для моих объектов.
Изменить: добавив код, если это поможет. Это не так много, но это то, что я пытаюсь сделать.
@SuppressWarnings("deprecation") // finalize() provided just to assert closure (deprecated starting Java 9)
@Override
protected final void finalize() throws Throwable {
if (nativeHandle_ != 0) {
// TODO finalizer is never called, how to assert that close() gets called?
throw new AssertionError("close() was not called; native object leaking");
}
}