Как узнать, был ли класс инициализирован?
Class cl = Class.forName("com.example.MyClass", false, getClass().getClassLoader());
// the false argument above indicates that the class should not be initialized
// but how can I check whether it already was?
cl.isInitialized(); // this does not exist, how can I know instead?
Почему я хочу знать, что:
В проекте клиента у нас есть уродливый класс (*) с большим количеством статических членов, которые я хочу проверить.Чтобы тест был предсказуемым, статические члены должны иметь значения по умолчанию, которые устанавливаются при инициализации.Если тестирование JUnit запускает новую JVM для каждого тестового класса, это не проблема: класс загружается заново при каждом выполнении.Но когда я выполняю тесты в Eclipse вместе с другими, одна и та же JVM используется для нескольких тестов, и класс не загружается заново, и у членов больше нет значений по умолчанию.Я хочу иметь возможность решить, имеет ли смысл тест (потому что класс будет только что загружен) или я должен просто вернуться, потому что тест не имеет смысла, если статические члены были изменены.
(*) рефакторинг запланирован, но не только на данный момент
Упрощенная версия класса
public class Settings {
public static Properties props;
static{
props.setProperty("key1", "val1");
props.setProperty("key2", "val2");
}
}
И тестовый класс
public class SettingsTest extends TestCase {
public void testDefauts() throws Exception {
Class cl = Class.forName("Settings", false, getClass().getClassLoader());
if(cl.isInitialized){ // doesn't exist
// Cannot test default values, because class was already initialized
return;
}
Properties props = Settings.props; // Settings is initialized here
assertEquals("val1", props.getProperty("key1"));
assertEquals("val2", props.getProperty("key2"));
}
}