JDBC 连接不适用于 PowerMockito
JDBC connection not working with PowerMockito
我正在尝试使用 PowerMockito
来模拟 DBUtil。与典型的测试用例不同,我不想完全模拟数据库调用。每当调用 Dbutil.getConnection() 时。我想 return 将连接对象连接到我的本地数据库。
当我从 @BeforeClass
方法调用时,下面的简单 jdbc 连接代码不起作用。但是当我从 java class 调用时它起作用了。
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;
}
我的测试class
@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 class 尝试时,相同的代码有效。
任何人都可以帮助理解这里出了什么问题吗?
我正在使用 ojdbc6.jar 和 powermokito-1.5.6,我的 Oracle 数据库版本是 11.2.0.4.0
谢谢。
编辑:
我发现 @PrepareForTest 注释导致了错误。没有注释连接成功但模拟不起作用。任何人都可以帮助我了解正在发生的事情吗?我对这些嘲弄的东西很陌生。
@PrepareForTest 注释的问题是,它递归地为所有依赖的 classes 创建存根。由于 DBUtil class 使用 java.sql.Connection class ,因此也为连接 class 创建了一个存根。
因此,当我尝试创建连接时,它引用存根 class 并抛出预期。
将@PowerMockIgnore 注释添加到class,以避免它。 @PowerMockIgnore 注释告诉 powermock 不要为属于给定包的 classes 创建。
@RunWith (PowerMockRunner.class)
@PrepareForTest({DbUtil.class})
@PowerMockIgnore({"java.sql.*"})
public class MyUtilTest {
...
}
这对我有用。
我正在尝试使用 PowerMockito
来模拟 DBUtil。与典型的测试用例不同,我不想完全模拟数据库调用。每当调用 Dbutil.getConnection() 时。我想 return 将连接对象连接到我的本地数据库。
当我从 @BeforeClass
方法调用时,下面的简单 jdbc 连接代码不起作用。但是当我从 java class 调用时它起作用了。
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;
}
我的测试class
@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 class 尝试时,相同的代码有效。
任何人都可以帮助理解这里出了什么问题吗?
我正在使用 ojdbc6.jar 和 powermokito-1.5.6,我的 Oracle 数据库版本是 11.2.0.4.0
谢谢。
编辑: 我发现 @PrepareForTest 注释导致了错误。没有注释连接成功但模拟不起作用。任何人都可以帮助我了解正在发生的事情吗?我对这些嘲弄的东西很陌生。
@PrepareForTest 注释的问题是,它递归地为所有依赖的 classes 创建存根。由于 DBUtil class 使用 java.sql.Connection class ,因此也为连接 class 创建了一个存根。
因此,当我尝试创建连接时,它引用存根 class 并抛出预期。
将@PowerMockIgnore 注释添加到class,以避免它。 @PowerMockIgnore 注释告诉 powermock 不要为属于给定包的 classes 创建。
@RunWith (PowerMockRunner.class)
@PrepareForTest({DbUtil.class})
@PowerMockIgnore({"java.sql.*"})
public class MyUtilTest {
...
}
这对我有用。