Я хотел бы проверить параметры, переданные DriverManager.getConnection, но я не знаю, как имитировать статический метод. Я использую JUnit 4 и Mockito для своих тестовых примеров. Есть ли хороший способ имитировать / проверить этот конкретный вариант использования?
Типичная стратегия уклонения от статических методов, от использования которых у вас нет возможности избежать, заключается в создании обернутых объектов и использовании вместо них объектов-оболочек.
Объекты-оболочки становятся фасадами реальных статических классов, и вы их не тестируете.
public String myApisToTheSaticMethodsInSlf4jMdcStaticUtilityClass() { return MDC.getWhateverIWant(); } }
Наконец, ваш тестируемый класс может использовать этот одноэлементный объект, например, за счет наличия конструктора по умолчанию для реального использования:
publicclassSomeClassUnderTest { final Slf4jMdcWrapper myMockableObject;
/** constructor used by CDI or whatever real life use case */ publicmyClassUnderTestContructor() { this.myMockableObject = Slf4jMdcWrapper.SINGLETON; }
/** constructor used in tests*/ myClassUnderTestContructor(Slf4jMdcWrapper myMock) { this.myMockableObject = myMock; } }
И здесь у вас есть класс, который можно легко протестировать, потому что вы напрямую не используете класс со статическими методами.
Если вы используете CDI и можете использовать аннотацию @Inject, то это еще проще. Просто создайте свой компонент-оболочку @ApplicationScoped, внедрите эту штуку в качестве соавтора (вам даже не нужны беспорядочные конструкторы для тестирования) и продолжайте имитировать.
Ответ 4
У меня была похожая проблема. Принятый ответ у меня не работал, пока я не внес изменение: @PrepareForTest(TheClassThatContainsStaticMethod.class) согласно документации PowerMock для mockStatic.