SQLException: «Не найдено подходящего драйвера», когда PowerMockito mockStatic DriverManager.class

Если вы отчаянно хотите сделать это, вы можете либо попробовать использовать eval ():

var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);

, либо использовать оконный объект:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);

http: //www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript

0
задан vzateychuk 13 July 2018 в 16:08
поделиться

2 ответа

Класс DriverManager попытается загрузить классы драйвера, указанные в системном свойстве "jdbc.drivers", как часть его инициализации. Это происходит, когда класс DriverManager загружается, т. Е. Даже до вызова любого метода, подобного getConnection(). Таким образом, это не то, что исключение, которое вы получаете, связано с тем, что вызываются реальные getConnection(). Это связано с тем, что вы не включили настоящий класс класса в путь класса, как видно из вашего pom, который DriverManager может загружать во время его инициализации. Итак, включите драйвер в свой pom, а затем попробуйте.

См. https://docs.oracle.com/javase/7/docs/api/java/sql/DriverManager. html и static в исходном коде класса DriverManager в https://github.com/JetBrains/jdk8u_jdk/blob/master/src/share/classes/java/sql/DriverManager. Java .

1
ответ дан Sanjeev Sachdev 17 August 2018 в 12:26
поделиться
  • 1
    ОК, я добавил пропущенную зависимость и переписал setupMock следующим образом: PowerMockito.mockStatic (DriverManager.class); PowerMockito.when (DriverManager.getConnection (anyString (), anyString (), anyString ())). ThenReturn (conn); Но существует новое исключение. Java.lang.LinkageError: нарушение ограничения загрузчика: загрузчик (экземпляр org / powermock / core / classloader / MockClassLoader), ранее инициированный загрузкой для другого типа & quot; когда я пытаюсь запустить DriverManager.registerDriver (новый oracle.jdbc.OracleDriver ()); Похоже, DriverManager совсем не издевается. У вас есть идеи? – vzateychuk 13 July 2018 в 20:58
  • 2
    И DriverManager и Drivers для регистрации должны загружаться одним и тем же загрузчиком классов. В вашем случае DriverManager был загружен MockClassLoader и драйвером oracle.jdbc.OracleDriver от собственного загрузчика классов JVM. Почему вы включили инструкцию DriverManager.registerDriver (new oracle.jdbc.OracleDriver ()? Вы действительно хотите программно загрузить драйвер Oracle? DriverManager.registerDriver () обычно вызывается самими драйверами при их новой загрузке. См. [ д0] docs.oracle.com/javase/7/docs/api/java/sql/… . – Sanjeev Sachdev 14 July 2018 в 06:22
  • 3
    Спасибо, Санджив, теперь ясно. Что касается вашего вопроса & quot; Зачем вы включили инструкцию DriverManager.registerDriver (new oracle.jdbc.OracleDriver () ": К сожалению, это не мой код, он жестко закодирован в классе, для которого мне нужно создать модульный тест. – vzateychuk 14 July 2018 в 18:31

Решение, которое работает в конечном итоге, когда я создаю экземпляр объекта objectUnderTest и помещаю его имя класса в аннотацию @PrepareForTest (без учета предупреждений в внешней консоли). Хотя я понятия не имею, почему он работает таким образом:

@RunWith(PowerMockRunner.class)
@PrepareForTest(DriverManager.class, MyClass.class)
public class MyClassTest {

  @Before
  public void setUp() throws Exception {
    Connection connection = mock(Connection.class);
    Statement statement = mock(Statement.class);

    PowerMockito.mockStatic(DriverManager.class);
    PowerMockito.when(DriverManager.getConnection(anyString(), anyString(), anyString())).thenReturn(connection);
  }

  @Test
  public void testMain() {
    // arrange
    String[] args = {"name", "password", "database"};
    MyClass myClass = new MyClass();
    myClass.method();
    ...
  }
0
ответ дан vzateychuk 17 August 2018 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: