2013-10-15 4 views
2

У меня есть единичный тест, который пытается создать SQLException для имитации ошибки базы данных. В конструкторе SQLException есть вызов DriverManager, который имеет статический блок инициализации. Я полагал, что я мог подавить статический блок с этим типом установки:Не удается подавить статический блок инициализатора DriverManager

@RunWith(PowerMockRunner.class) 
@SuppressStaticInitializationFor({"java.sql.DriverManager"}) 
public class StaticTest 
{ 
    @Test 
    public void testStaticSuppress() throws Exception 
    { 
     SQLException ex = new SQLException(); 
     expect(...).andThrow(ex); 
    } 
} 

При запуске теста, статический блок в DriverManager еще называется. Что я делаю не так?


Разъяснение

  • Я бег Powermock 1.5 - Я был под впечатлением, что использование v1.5 позволяет мне фиктивные системные классам
  • Когда DriverManager работает это статический блок инициализации, я получить это исключение:

Oct 15, 2013 1:06:24 PM oracle.jdbc.driver.OracleDriver registerMBeans

WARNING: Error while registering Oracle JDBC Diagnosability MBean.

java.lang.LinkageError: loader constraint violation: when resolving method "java.lang.management.ManagementFactory.getPlatformMBeanServer()Ljavax/management/MBeanServer;" the class loader (instance of org/powermock/core/classloader/MockClassLoader) of the current class, oracle/jdbc/driver/OracleDriver, and the class loader (instance of) for resolved class, java/lang/management/ManagementFactory, have different Class objects for the type javax/management/MBeanServer; used in the signature

  • Я понимаю, что могу сделать издевательство SQLException и никогда не копировать его напрямую. Я бы предпочел не идти по этому маршруту, поскольку это означало бы обновление 91 различных модульных тестов. Я задал вопрос, потому что это выглядело так, как будто мой код должен работать отлично в соответствии с документами PowerMock.
+0

ли это отношение для ваших тестов, чтобы подавить инициализацию 'DriverManager'? –

+0

Для моих тестов важно смоделировать ошибки базы данных. Самый простой способ сделать это - создать 'SQLException', но у него есть куча побочных эффектов из-за' DriverManager' – RustyTheBoyRobot

+0

Статический инициализатор 'DriverManager' регистрирует драйверы в пути к классам. Мне любопытно, как это может вызвать побочные эффекты в ваших тестах, если только вы не тестируете реализацию драйвера JDBC. –

ответ

2

Я подозреваю (но я не уверен), что Powermock не в состоянии предотвратить статический инициализатор от работы для классов, которые загружаются в систему или загрузчик классов (как классы JRE в том числе пакета java.sql являются) ,


После размещения в Powermock группы Google, я получил this response:

You can mock, suppress methods, stub methods etc in these classes since powermock 1.2.5 but you cannot suppress static initializers.

+0

Я тоже об этом подумал, но [docs] (http://code.google.com/p/powermock/wiki/MockSystem), похоже, сказал, что они исправили это в Powermock 1.2.5, и я запускаю 1.5 (см. Мое обновление). Это правильный вывод или я неправильно читаю документы? – RustyTheBoyRobot

+0

Основываясь на этой ссылке, я бы сказал, что вы пытаетесь работать, но я просто не уверен. –

+0

Ну, ваш ответ полезная информация для <1.2.5 пользователей. Спасибо за ваши мысли. – RustyTheBoyRobot

2

Смотрите эту страницу: Google Groups PowerMock Group

Вам нужно добавить к классу: @PowerMockIgnore("javax.management.*")

+0

Добавление этого уровня на уровне класса не устранило ПРЕДУПРЕЖДЕНИЕ, но ошибка связи исчезла, и теперь тест работает нормально. –

Смежные вопросы