powermock在另一个静态方法中模拟一个静态方法

vlju58qv  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(454)

我有以下代码

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. public class DatabaseReader {
  7. public static final String CONNECTION = "jdbc:mysql://localhost/testdb";
  8. public static String getById(Integer id) throws SQLException {
  9. String query = "SELECT * FROM Foo WHERE Id = ?";
  10. Connection connection = DriverManager.getConnection(CONNECTION);
  11. PreparedStatement preparedStatement = connection.prepareStatement(query);
  12. preparedStatement.setInt(1, id);
  13. ResultSet resultSet = preparedStatement.executeQuery();
  14. resultSet.next();
  15. String result = resultSet.getString(0);
  16. resultSet.close();
  17. preparedStatement.close();
  18. connection.close();
  19. return result;
  20. }
  21. public static String getId(int id) throws SQLException{
  22. return getById(id);
  23. }
  24. }

有没有可能powermock函数getbyid,以便在测试getid时,得到getbyid的mock值?我试着这样:

  1. import static org.junit.Assert.assertEquals;
  2. import static org.junit.Assert.fail;
  3. import static org.mockito.Mockito.when;
  4. import static org.powermock.api.mockito.PowerMockito.mockStatic;
  5. import static org.powermock.api.mockito.PowerMockito.verifyStatic;
  6. import java.sql.SQLException;
  7. import org.junit.Test;
  8. import org.junit.runner.RunWith;
  9. import org.powermock.api.mockito.PowerMockito;
  10. import org.powermock.core.classloader.annotations.PrepareForTest;
  11. import org.powermock.modules.junit4.PowerMockRunner;
  12. @RunWith(PowerMockRunner.class)
  13. @PrepareForTest(DatabaseReader.class)
  14. public class DatabaseReaderTest {
  15. @Test
  16. public void testGetById() {
  17. int inputId = 1;
  18. String returnValue = "JavaCodeGeeks";
  19. mockStatic(DatabaseReader.class);
  20. try {
  21. when(DatabaseReader.getById(inputId))
  22. .thenReturn(returnValue);
  23. String actual = DatabaseReader.getId(inputId);
  24. System.out.println(actual);
  25. verifyStatic();
  26. assertEquals(returnValue, actual);
  27. } catch (SQLException e) {
  28. fail("No exception should be thrown.");
  29. }
  30. }

但是,我打电话的时候它不起作用

  1. String actual = DatabaseReader.getId(inputId);

它尝试调用整个数据库方法。我对iu是否可以模拟静态方法的静态方法调用感到困惑。

moiiocjp

moiiocjp1#

你在用mockito when . 你需要使用 org.powermock.api.mockito.PowerMockito.when .

uttx8gqw

uttx8gqw2#

我认为你不应该这样考试。
被测试的对象永远不能是你的mock(就powermock而言,preparedfortest),你应该测试真实的代码,而不是“powermock增强”的东西,它的行为可能和真实的代码不一样。
mock(甚至是由powermock管理的mock)旨在模拟“依赖”的行为。
现在每一个代码都是可单元测试的,所以有时如果你想正确地测试它,你应该修改它:使用依赖注入(这基本上与使所有东西都是静态的不兼容)方法,通常使用关于更好的依赖分离的方法等等。
一般来说,powermock是一个我们永远不应该使用的工具(好吧,这可能是主观的,但除了我自己的观点之外,我从各种不同的资源中听到过这种说法),除非我们讨论的是一些遗留系统。
所以,总的建议是:摆脱静态方法和重构。如果出于教育目的,您真的想学习powermock:
别“碰” DatabaseReader 类(读取,不要增强它/用power mock更改它的字节码)
相反,嘲笑 DriverManager (powermock), Connection (mockito/easymock/随便什么), PreparedStatement (mockito/easymock/随便什么)和 ResultSet (mockito/easymock/随便什么)

相关问题