Прежде всего пара вещей:
- Почему loading_status stati c? В основном 2 экземпляра этого класса будут использовать одну и ту же переменную loading_status. loading_status либо не должен быть stati c, либо checkLoadingStatus также должен быть stati c.
- loading_status ужасно назван. Если вы хотите сохранить это значение c, вам следует назвать это LOADING_STATUS. Если это не будет stati c, назовем его loadingStatus. Это соглашение Java.
- Вы должны создать правильный тип перечисления для loading_status, а не целое число.
while (loading_status == IN_PROGRESS);
- просто плохая практика. По крайней мере, вы можете сделать следующее: while(loading_status == IN_PROGRESS) { Thread.sleep(100); };
Однако лучше использовать тайм-аут. Что-то вроде:
long timeoutMillis = 5000L; // Should come from a configuration or something
long endTimeMillis = System.currentTimeMillis() + timeoutMillis;
while (loadingStatus == IN_PROGRESS) {
long remainingMillis = end - System.currentTimeMillis();
if (remaining <= 0) {
// Timeout while loading
loadingStatus = LOADING_ERROR;
break;
}
Thread.sleep(50);
}
// ...
И, наконец, я предполагаю, что что-то обновит loadingStatus до завершения или что-то еще. Я полагаю, вы используете синхронизированный там же. Если загрузка происходит в 2 разных потоках, вы окажетесь в тупике. Если checkLoadingStatus сначала вводит синхронизированный блок, поэтому, когда загрузка завершена, поток загрузки никогда не сможет войти в синхронизированный блок, потому что checkLoadingStatus удерживает блокировку.
Последний, но не менее важный, чтобы ответить на ваш вопрос, если вы хотите сохранить свой метод закрытым, вы можете вызвать его через рефлексию, но это опять-таки плохая практика. Как правило, вам следует избегать модульного тестирования частных методов и модульного тестирования тех методов, которые его вызывают. Однако, если вам определенно необходимо выполнить модульное тестирование определенного метода, сделайте его закрытым для пакета, а не закрытым, а затем вы можете создать модульный тест в том же пакете, где находится класс, содержащий ваш метод. И вы можете добавить комментарий к методу, говоря, что он виден только для модульного тестирования. Пример структуры вашего кода в этом случае:
src
+-- main
+-- +-- com/app/MyClass.java
+-- test
+-- com/app/MyClassTest.java // this test class will able to access package-private methods in MyClass