【问题标题】:JDBC connection not working with PowerMockitoJDBC 连接不适用于 PowerMockito
【发布时间】:2018-05-27 16:39:02
【问题描述】:

我正在尝试使用PowerMockito 来模拟 DBUtil。与典型的测试用例不同,我不想完全模拟数据库调用。每当调用 Dbutil.getConnection() 时。我想将连接对象返回到我的本地数据库。

当我从@BeforeClass 方法调用时,下面的简单 jdbc 连接代码不起作用。但是当我从 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 注释导致错误。没有注释连接成功但模拟不起作用。谁能帮助我了解正在发生的事情?我对这些嘲笑的东西很陌生。

【问题讨论】:

    标签: java unit-testing jdbc mockito powermockito


    【解决方案1】:

    @PrepareForTest 注解的问题是,它递归地为所有依赖类创建存根。由于 DBUtil 类使用 java.sql.Connection 类,因此也为 Connection 类创建了一个存根。

    所以,当我尝试创建连接时,它指的是存根类并引发预期。

    在类中添加@PowerMockIgnore 注解,以避免它。 @PowerMockIgnore 注释告诉 powermock 不要为给定包下的类创建。

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

    这对我有用。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 2013-12-02
      • 2020-05-28
      • 2018-09-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2016-12-23
      相关资源
      最近更新 更多