我有一个使用statement.execute(query)执行SQL语句的方法。如何测试这个void函数,因为它不返回任何内容?我正在使用Mockito和@Spy。
我为execute()方法附加了我的代码片段,该方法接受一个查询的ArrayList:
public void execute(Statement statement, ArrayList<String> queryList) throws SQLException {
SQLException sqlException = null;
// read script line by line
for (String line : queryList) {
try {
statement.execute(line);
} catch (SQLException e1) {
if (null == sqlException)
sqlException = e1;
else {``
sqlException.addSuppressed(e1);
}
}
}
if (null != sqlException)
throw sqlException;
}这是我的测试类,我需要使用它来测试主类中的void execute()方法。我正在使用Mocking和doNothing(),但是我得到了不必要的存根异常。
@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)
public class TestSQL {
@Spy
RunSQL runSQL=new RunSQL("dbConfig");
@Mock
BufferedReader br;
@Spy
ArrayList<String> queryList;
@Mock
Statement s;
@Mock
Connection c;
@Mock
RunSQL runsql;
@Test
public void testExecute() throws SQLException, IOException {
Mockito.when(br.readLine()).thenReturn("something");
runSQL.execute(s, queryList);
Mockito.doNothing().when(runsql).execute(s,queryList);
}
}发布于 2019-03-20 17:36:09
可以像下面这样测试常规执行路径:
@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)
public class RunSQLTest {
@Test
public void queries_are_executed_one_by_one() throws SQLException {
//given:
RunSQL runSQL = new RunSQL("dbConfig");
List<String> queries = new ArrayList<>();
queries.add("query1");
queries.add("query2");
Statement statement = mock(Statement.class);
//when:
runSQL.execute(statement, queries);
//then:
verify(statement, times(1)).execute("query1");
verify(statement, times(1)).execute("query2");
verifyNoMoreInteractions(statement);
}
}在这里,您只需严格地断言所有的查询都被成功地逐个执行,而没有抛出任何异常。严格性是通过添加verifyNoMoreInteractions(statement)实现的。如果你不添加这个,那么Mockito只会尽最大的努力去存根模拟交互。这是默认行为
https://stackoverflow.com/questions/55253970
复制相似问题