测试 CRUD 操作,同时模拟方法中的静态 PreparedStatement 方法



我原来的 CRUD 方法生成一个预准备语句,并根据给定的参数设置字符串。

public class StatementUtility {
...
public static PreparedStatement getFoo(String bar, Connection conn) {
String query = "SELECT Foo FROM BarTable WHERE Bar = ?";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(query);
pstmt.setString(1, bar);
}
catch (SQLException e) {
..
}
return pstmt;
}
...
}

在此语句中,设置了我使用的数据库。但是,我在MySQL服务器中创建了一个TestDB,我想在其中测试删除方法:

public static String deleteFoo(List<String> input) {
Connection conn = driver.connectCustomerDB(input);
try(PreparedStatement pstmt = StatementUtility.getFoo(String someString, conn)) {
...
}
}

这是我到目前为止的测试

@RunWith(PowerMockRunner.class)
@PrepareForTest(StatementUtility.class)
public class DBConnectionBTBAdminTest {

@Test
public void deleteTest() {
List<String> testInput = new ArrayList<>();
testInput.add("hello");
testInput.add("World");
Driver driver = new Driver();
Connection conn = driver.connectCustomerDB(testInput);
String query = "FooBarFooBarFooBarFooBarFooBarFooBarFooBarFooBar";
try {
//try mocking the Method within
BDDMockito.given(StatementUtility.getFoo(ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), any(Connection.class))).willReturn(conn.prepareStatement(stringBuilder.toString()));
//call the method I want to test
SomeClass.deleteCategory(testInput, emptyArray);
...
} catch (SQLException e) {
...
}
}
}

我得到的错误是我最初创建 PreparedStatement 的方法中的空指针异常,但这不是重点,因为我根本不想进入此方法,而是存根它。

我也尝试使用Mockito而不是BDDMockito(见这里:https://stackoverflow.com/a/21116014/8830232) 并使用实际值而不是参数匹配器。

我还尝试了一些其他的东西,比如嘲笑连接

目前我正在使用JUnit@4.12Mockito@2.13.0powermock@1.7.1

编辑: 为了@glytching答案的工作,我不得不将 mockito 从 2.x 降级到 1.x。>在这种情况下不要忘记调整 powermock 依赖项

除了@PrepareForTest(StatementUtility.class)(它告诉 PowerMock 准备这个类进行测试)之外,您还必须为所有StatementUtility方法启用静态模拟。您可以通过调用...

PowerMockito.mockStatic(StatementUtility.class);

。在测试中,在您尝试对该模拟设置任何期望之前。

例如:

@RunWith(PowerMockRunner.class)
@PrepareForTest(StatementUtility.class)
public class DBConnectionBTBAdminTest {

@Test
public void deleteTest() {
PowerMockito.mockStatic(StatementUtility.class);
List<String> testInput = new ArrayList<>();
testInput.add("hello");
testInput.add("World");
Driver driver = new Driver();
Connection conn = driver.connectCustomerDB(testInput);
String query = "FooBarFooBarFooBarFooBarFooBarFooBarFooBarFooBar";
try {
BDDMockito.given(StatementUtility.getFoo(...)).willReturn(...);
...
} catch (SQLException e) {
...
}
}
}

相关内容

  • 没有找到相关文章

最新更新