org.powermock.reflect.exceptions.MethodNotFoundException: - 模拟时 java sql 类
org.powermock.reflect.exceptions.MethodNotFoundException: - when mocking java sql classes
我正在尝试为包含对 Postgres 数据库的调用的 servlet 编写单元测试。我在嘲笑 Connection
、Statement
和 ResultSet
classes。但是,对这些调用的模拟的任何方法调用都会给我一个 MethodNotFoundException
。有一些参考资料提到 Java 8 和 PowerMock 1.5.x 破坏了某些功能,但我使用的是 PowerMock 1.6.6。非常感谢任何帮助。
代码如下:
public class CitiesServlet 扩展了 HttpServlet {
private static final Logger log = LoggerFactory.getLogger(CitiesServlet.class);
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
log.debug("doGet called on servlet=" + this.getClass());
PrintWriter writer = ServletUtils.setResponseParametersAndGetPrinter(resp);
CitiesWrapperModel citiesWrapperModel = new CitiesWrapperModel();
String message = ServletHelper.getInstance().openDBConnection("PgBundle");
if (!message.startsWith("Servus")) {
writer.println("<h1>Database connection failed to open " + message + "</h1>");
return;
}
CitiesData citiesData = new CitiesData();
citiesData.setCities(getCities());
citiesWrapperModel.setData(citiesData);
ServletUtils.writeResultsAndCloseStream(writer, citiesWrapperModel);
}
public List<String> getCities() {
List<String> cities = new ArrayList<>();
String query = "SELECT * FROM cities";
try {
Connection connection = ServletHelper.getInstance().getConnection();
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
String cityName = rs.getString("cityName");
cities.add(cityName);
}
st.close();
rs.close();
} catch (SQLException sqe) {
log.warn("SQL exception when accessing users table, sql message= " + sqe.getMessage());
}
return cities;
}}
测试class:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServletHelper.class, Statement.class, ResultSet.class, Connection.class})
public class CitiesServletITTest {
private HttpServletRequest testRequest;
private HttpServletResponse testResponse;
private ServletHelper mockServletHelper;
private Connection mockConnection;
private CitiesServlet citiesServlet;
@Before
public void setUp(){
citiesServlet = new CitiesServlet();
testRequest = new TestHttpServletRequest();
testResponse = new TestHttpServletResponse();
mockServletHelper = mock(ServletHelper.class);
mockConnection = mock(Connection.class);
}
@Test
public void canGetCitiesData() throws ServletException, IOException, SQLException {
PowerMockito.mockStatic(ServletHelper.class);
PowerMockito.when(ServletHelper.getInstance()).thenReturn(mockServletHelper);
when(mockServletHelper.openDBConnection(Mockito.anyString())).thenReturn("Servus");
when(mockServletHelper.getConnection()).thenReturn(mockConnection);
ResultSet resultSet = Mockito.mock(ResultSet.class);
Mockito.when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
Mockito.when(resultSet.getString("cityName")).thenReturn("Philadelphia").thenReturn("Boston").thenReturn("New York");
Statement statement = Mockito.mock(Statement.class);
Mockito.when(statement.executeQuery(Mockito.anyString())).thenReturn(resultSet);
Mockito.when(mockConnection.createStatement()).thenReturn(statement);
citiesServlet.doGet(testRequest, testResponse);
}
}
更新给任何登陆此的人。我发现这是 PowerMock 1.6.6 的回归错误,并且在 PowerMock(https://github.com/powermock/powermock/issues/717) 的 github 回购中有一个错误 (#177),目标修复版本为 1.6.7 .回到 1.6.5 为我解决了这个问题。
我正在尝试为包含对 Postgres 数据库的调用的 servlet 编写单元测试。我在嘲笑 Connection
、Statement
和 ResultSet
classes。但是,对这些调用的模拟的任何方法调用都会给我一个 MethodNotFoundException
。有一些参考资料提到 Java 8 和 PowerMock 1.5.x 破坏了某些功能,但我使用的是 PowerMock 1.6.6。非常感谢任何帮助。
代码如下: public class CitiesServlet 扩展了 HttpServlet {
private static final Logger log = LoggerFactory.getLogger(CitiesServlet.class);
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
log.debug("doGet called on servlet=" + this.getClass());
PrintWriter writer = ServletUtils.setResponseParametersAndGetPrinter(resp);
CitiesWrapperModel citiesWrapperModel = new CitiesWrapperModel();
String message = ServletHelper.getInstance().openDBConnection("PgBundle");
if (!message.startsWith("Servus")) {
writer.println("<h1>Database connection failed to open " + message + "</h1>");
return;
}
CitiesData citiesData = new CitiesData();
citiesData.setCities(getCities());
citiesWrapperModel.setData(citiesData);
ServletUtils.writeResultsAndCloseStream(writer, citiesWrapperModel);
}
public List<String> getCities() {
List<String> cities = new ArrayList<>();
String query = "SELECT * FROM cities";
try {
Connection connection = ServletHelper.getInstance().getConnection();
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
String cityName = rs.getString("cityName");
cities.add(cityName);
}
st.close();
rs.close();
} catch (SQLException sqe) {
log.warn("SQL exception when accessing users table, sql message= " + sqe.getMessage());
}
return cities;
}}
测试class:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ServletHelper.class, Statement.class, ResultSet.class, Connection.class})
public class CitiesServletITTest {
private HttpServletRequest testRequest;
private HttpServletResponse testResponse;
private ServletHelper mockServletHelper;
private Connection mockConnection;
private CitiesServlet citiesServlet;
@Before
public void setUp(){
citiesServlet = new CitiesServlet();
testRequest = new TestHttpServletRequest();
testResponse = new TestHttpServletResponse();
mockServletHelper = mock(ServletHelper.class);
mockConnection = mock(Connection.class);
}
@Test
public void canGetCitiesData() throws ServletException, IOException, SQLException {
PowerMockito.mockStatic(ServletHelper.class);
PowerMockito.when(ServletHelper.getInstance()).thenReturn(mockServletHelper);
when(mockServletHelper.openDBConnection(Mockito.anyString())).thenReturn("Servus");
when(mockServletHelper.getConnection()).thenReturn(mockConnection);
ResultSet resultSet = Mockito.mock(ResultSet.class);
Mockito.when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
Mockito.when(resultSet.getString("cityName")).thenReturn("Philadelphia").thenReturn("Boston").thenReturn("New York");
Statement statement = Mockito.mock(Statement.class);
Mockito.when(statement.executeQuery(Mockito.anyString())).thenReturn(resultSet);
Mockito.when(mockConnection.createStatement()).thenReturn(statement);
citiesServlet.doGet(testRequest, testResponse);
}
}
更新给任何登陆此的人。我发现这是 PowerMock 1.6.6 的回归错误,并且在 PowerMock(https://github.com/powermock/powermock/issues/717) 的 github 回购中有一个错误 (#177),目标修复版本为 1.6.7 .回到 1.6.5 为我解决了这个问题。