java - 测试(模拟)一个 void 函数,该函数在内部调用其他与数据库创建连接的函数

标签 java unit-testing mocking mockito powermockito

我有一个类,其中有一个私有(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/

相关文章:

java - 如何在camel蓝图中引用 "disable"bean?

java - 具有 RabbitMQ 客户端身份验证异常的 QPID 代理

php - 为什么 laravel 5.4 没有 see() 方法

python - 如何在 Django 上模拟关系

ios - OCMock "expected method was not invoked"即使我自己调用它

java - 独立 Java 多线程应用程序的 Db 连接池是否有意义?

iphone - 在不属于您的 Apple 设备上测试错误

C# 单元测试,使用 zip 文件中的 XML

groovy - 我如何使用 Groovy 的 mock.interceptor 包来模拟对象构造函数?

java - Java 中的递归,当方法调用自身之后有 return 语句时