我有一个类,其中有一个私有(private)变量 Connection。我想测试 functionA,为此我必须模拟 functionB 和 functionC。
我尝试使用powermock和mockito但无法做到这一点。
测试 fucntionA 以及模拟 functionB 和 functionC 应该做什么。
public class ToMock {
private Connection connection;
private static functionA(String name) {
// do something
functionB()
return xyz;
}
public static void functionB() {
connection = functionC("localhost", 10000);
}
public static void functionC(String hostName, int port) {
//make a connection to db
String connectionString = String.format("jdbc:hive2://%s:%d/",emrHost, port);
LOGGER.info("Connection string {}", connectionString);
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection(connectionString, "hadoop", "");
LOGGER.info("Connected successfully");
return con;
} catch (ClassNotFoundException e) {
throw Throwables.propagate(e);
}
}
}
最佳答案
像 @neurotic-d 描述的那样重构你的代码。像这样的事情:
public class ToMock {
private Connection connection;
public ToMock(Connection connection){
this.connection = connection;
}
private functionA(String name) {
// do something
return xyz;
}
}
public class ToMockFactory {
public static ToMock toMock(){
return new ToMock(functionB());
}
public static Connection functionB() {
return functionC("localhost", 10000);
}
public static Connection functionC(String hostName, int port) {
//make a connection to db
String connectionString = String.format("jdbc:hive2://%s:%d/",emrHost, port);
LOGGER.info("Connection string {}", connectionString);
try {
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection(connectionString, "hadoop", "");
LOGGER.info("Connected successfully");
return con;
} catch (ClassNotFoundException e) {
throw Throwables.propagate(e);
}
}
}
关于java - 测试(模拟)一个 void 函数,该函数在内部调用其他与数据库创建连接的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36741812/