[英]Mockito mocking database calls
I have a class that takes in a database url and username, connects to the database, and executes a query, assigning the results to a hash map.
import java.sql.*;
import java.util.Map;
public class MyClass {
private final String dbUrl;
private final String username;
MyClass(final String dbUrl, final String username) {
this.dbUrl = dbUrl;
this.username = username;
}
public void queryDatabase(final Map<Integer, String> userIdToName) {
final String query = "select user_id, name from users";
try (final Connection connection = DriverManager.getConnection(dbUrl, username, null);
final PreparedStatement ps = connection.prepareStatement(query);
final ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
final int userId = rs.getInt(1);
final String name = rs.getString(2);
userIdToName.put(userId, name);
}
} catch (final SQLException e) {
System.out.println(e.toString());
}
}
}
我正在嘗試使用 Mockito 來模擬queryDatabase()
。 我添加了 PowerMockito 來模擬DriverManager
。
我的測試 class:
import org.junit.Before;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest(DriverManager.class)
class MyClassTest {
@Mock private Connection mockConnection = mock(Connection.class);
@Mock private PreparedStatement mockStatement = mock(PreparedStatement.class);
@Mock private ResultSet resultSet = mock(ResultSet.class);
@InjectMocks private static MyClass myClass = new MyClass("test_url", "test_username");
@Before
public void setUp() throws Exception {
mockStatic(DriverManager.class);
when(DriverManager.getConnection(anyString(), anyString(), null)).thenReturn(mockConnection);
}
@Test
void testQueryDatabase() throws Exception {
when(mockConnection.prepareStatement(anyString())).thenReturn(mockStatement);
when(mockStatement.executeQuery(anyString())).thenReturn(resultSet);
when(resultSet.getInt(Mockito.anyInt())).thenReturn(1);
when(resultSet.getString(anyInt())).thenReturn("john smith");
final Map<Integer, String> useridToUser = new HashMap<>();
myClass.queryDatabase(useridToUser);
System.out.println(useridToUser);
}
}
運行我的測試的 output 是:
java.sql.SQLException: No suitable driver found for test_url
{}
我預計:
{1=john smith}
我怎樣才能正確地模擬這個?
除非絕對必要,否則我已閱讀以避免使用PowerMock
,因此我也非常願意接受重構建議,以盡可能避免使用。
您可以嘗試執行以下操作:
class MyClassTest extends PowerMockTestCase {
添加依賴項:
<dependency>
<groupId>org.powermock.tests</groupId>
<artifactId>powermock-tests-utils</artifactId>
<version>1.6.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-testng</artifactId>
<version>1.4.9</version>
<scope>test</scope>
</dependency>
也可能你需要 initMock 在設置:
@Before
public void setUp() throws Exception {
mockStatic(DriverManager.class);
initMocks(this);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.