首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mocking for JDBC测试execute()方法

使用mocking for JDBC测试execute()方法
EN

Stack Overflow用户
提问于 2019-03-20 13:16:36
回答 1查看 348关注 0票数 1

我有一个使用statement.execute(query)执行SQL语句的方法。如何测试这个void函数,因为它不返回任何内容?我正在使用Mockito和@Spy。

我为execute()方法附加了我的代码片段,该方法接受一个查询的ArrayList:

代码语言:javascript
复制
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(),但是我得到了不必要的存根异常。

代码语言:javascript
复制
    @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);
    }
 }
EN

回答 1

Stack Overflow用户

发布于 2019-03-20 17:36:09

可以像下面这样测试常规执行路径:

代码语言:javascript
复制
@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只会尽最大的努力去存根模拟交互。这是默认行为

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55253970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档