[英]PowerMock a static method inside another static method
我有以下代码
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DatabaseReader {
public static final String CONNECTION = "jdbc:mysql://localhost/testdb";
public static String getById(Integer id) throws SQLException {
String query = "SELECT * FROM Foo WHERE Id = ?";
Connection connection = DriverManager.getConnection(CONNECTION);
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, id);
ResultSet resultSet = preparedStatement.executeQuery();
resultSet.next();
String result = resultSet.getString(0);
resultSet.close();
preparedStatement.close();
connection.close();
return result;
}
public static String getId(int id) throws SQLException{
return getById(id);
}
}
是否可以对 function getById 进行 powermock,以便在测试 getId 时获得 getById 的模拟值? 我正在尝试这个:
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.verifyStatic;
import java.sql.SQLException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(DatabaseReader.class)
public class DatabaseReaderTest {
@Test
public void testGetById() {
int inputId = 1;
String returnValue = "JavaCodeGeeks";
mockStatic(DatabaseReader.class);
try {
when(DatabaseReader.getById(inputId))
.thenReturn(returnValue);
String actual = DatabaseReader.getId(inputId);
System.out.println(actual);
verifyStatic();
assertEquals(returnValue, actual);
} catch (SQLException e) {
fail("No exception should be thrown.");
}
}
但是,当我打电话时它不起作用
String actual = DatabaseReader.getId(inputId);
它试图调用整个数据库方法。 我对 IU 是否可以从 static 方法模拟 static 方法调用感到困惑。
我认为你不应该这样测试。
被测试的 Object 永远不能成为您的模拟(就 PowerMock 而言的 PreparedForTest),您应该测试真实的代码,而不是“增强模拟能力”的东西,可能会或可能不会像真实的代码一样。
模拟(甚至是由 Power 模拟管理的模拟)旨在模仿“依赖项”的行为。
现在每个代码都是可单元测试的,因此有时如果您希望对其进行正确测试,则应该对其进行修改:使用依赖注入(基本上与 make-everything-static 不兼容)方法,通常用于更好的依赖分离等向前。
一般来说,Power Mock 是一个我们永远不应该使用的工具(好吧,这可能是主观的,但除了我自己的观点之外,我已经从各种不同的资源中听到了这个声明),除非我们可能正在谈论一些遗留系统。
所以底线,一般建议是:摆脱 static 方法并重构。 如果这是出于教育目的并且您真的想学习 PowerMock:
不要“触摸” DatabaseReader
class(读取,不要增强它/使用 power mock 更改其字节码)
相反,模拟DriverManager
(PowerMock)、 Connection
(Mockito/EasyMock/whatever)、 PreparedStatement
(Mockito/EasyMock/whatever) 和ResultSet
(Mockito/EasyMock/whatever)
when
. 您需要使用org.powermock.api.mockito.PowerMockito.when
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.