Соединение JDBC не работает с PowerMockito - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь использовать PowerMockito, чтобы издеваться над DBUtil.В отличие от типичного тестового примера, я не хочу полностью высмеивать вызовы БД.Всякий раз, когда вызывается Dbutil.getConnection ().Я хочу вернуть объект подключения в мою локальную базу данных.

Простой код подключения jdbc, указанный ниже, не работает, когда я вызываю метод @BeforeClass.Но это работает, когда я звоню из класса Java.

public static Connection getConnection() throws Exception {
    System.out.println("-------- Connecting to  " + Constants.CONNECTION_STR + "  ------");

    try {
        Class.forName(Constants.ORACLE_DRIVER_NAME);
    } 
    catch (ClassNotFoundException e) {          
        throw new Exception("JDBC Driver not found... " + e);           
    }
    catch (Exception e) {
        // TODO: handle exception
        System.out.println("getConnection :: exp :: "+ e);
    }

    System.out.println("Oracle JDBC Driver Registered Sucessfully!");

    Connection connection = null;

    try {
        connection = DriverManager.getConnection(Constants.CONNECTION_STR, Constants.USERNAME, Constants.PASSWORD);
    } 
    catch (SQLException e) {
        throw new Exception("Connection Failed!",e);                        
    }   

    if (connection != null) {
        System.out.println("Connected to Database Sucessfully, take control your database now!");
        return connection;
    } 

    System.out.println("Failed to make connection!");
    return null;
}

Мой тестовый класс

@RunWith (PowerMockRunner.class)
@PrepareForTest(DbUtil.class)
public class MyUtilTest {

@Mock
private DbUtil dbUtil;

@InjectMocks
private MyUtil myUtil;

private static Connection myDBConn;


@BeforeClass
public static void beforeClass() throws Exception {           
    myDBConn = OracleJDBCConnetion.getConnection(); // This always throws invalid username/password exception.
}

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testIsAdminUser() throws Throwable{


    PowerMockito.mockStatic(DbUtil.class);          
    PowerMockito.when(DbUtil.getConnection()).thenReturn(myDBConn);     

    String accId= "TH123" ;
    boolean  isAdmin = MyUtil.isAdminUser(cloudAccGuid);        
    System.out.println("isAdmin  : " + isAdmin);

    //then
    PowerMockito.verifyStatic(Mockito.times(1));
    DbUtil.getConnection();
    assertTrue(isAdmin);


    //Finally I am closing my connection.
    if(myDBConn!=null &&  !myDBConn.isClosed())
        OracleJDBCConnetion.closeConnection(myDBConn);

}

}

Метод beforeClass всегда выбрасывает значение ниже ожидаемого.

Connection Failed! java.sql.SQLException: ORA-01017: invalid username/password; logon denied

Но тот же код работает, когда я пытаюсь из обычного класса Java,

Может ли кто-нибудь помочь понять, что здесь не так?

Я использую ojdbc6.jar и powermokito-1.5.6, и моя версия базы данных Oracle - 11.2.0.4.0

Спасибо.

Редактировать: я обнаружил, что @PrepareForTestаннотация вызывает ошибку.без аннотации соединение успешно, но макет не работает.Может ли кто-нибудь помочь мне понять, что происходит?Я очень новичок в этих насмешках.

1 Ответ

0 голосов
/ 13 июня 2018

Проблема с аннотацией @PrepareForTest заключается в том, что она рекурсивно создает заглушки для всех зависимых классов.Поскольку класс DBUtil использует класс java.sql.Connection, для класса Connection также создается заглушка.

Итак, когда я пытаюсь создать соединение, он ссылается на класс заглушки и вызывает исключение.

Добавьте аннотацию @PowerMockIgnore к классу, чтобы избежать этого.Аннотация @PowerMockIgnore указывает powermock не создавать классы, попадающие в данный пакет.

@RunWith (PowerMockRunner.class)
@PrepareForTest({DbUtil.class})
@PowerMockIgnore({"java.sql.*"})
public class MyUtilTest {
  ... 
}

Это сработало для меня.

...