首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Mockito模拟Spring的JdbcTemplate.queryForList?

如何使用Mockito模拟Spring的JdbcTemplate.queryForList?
EN

Stack Overflow用户
提问于 2019-05-07 12:47:36
回答 2查看 6.1K关注 0票数 0

我想知道如何使用Mockito模拟特定的代码:

代码语言:javascript
复制
List<Map<String, Object>> list = jdbcTemplate.queryForList(
    sqlQuery, 
    new Object[] { inflowId }
);

我尝试了以下代码:

代码语言:javascript
复制
Mockito.doReturn(list)
       .when(jdbcTemplate)
       .queryForList(Mockito.anyString(), Mockito.any(Class.class));

和:

代码语言:javascript
复制
when(
    jdbcTemplate.queryForList(Mockito.anyString(), Mockito.any(Object[].class))
).thenReturn(list);

我的问题是特定的方法在JUnit中没有被模仿。当该方法被调用时,它返回null,而它应该返回列表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-07 13:09:09

这应该是可行的:

代码语言:javascript
复制
import org.hamcrest.CoreMatchers;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class DemoTest {

    @Test
    public void mockJdbcTemplate() {
        JdbcTemplate mockTemplate = Mockito.mock(JdbcTemplate.class);

        List<Map<String, Object>> mockResult = new ArrayList<>();

        Mockito.when(mockTemplate.queryForList(Mockito.anyString(), ArgumentMatchers.<Object>any())).thenReturn(mockResult);
        // Alternatively:
        // when(mockTemplate.queryForList(anyString(), Mockito.<Object>any())).thenReturn(mockResult);

        String query = "some query";
        Object[] params = new Object[]{1};

        List<Map<String, Object>> returnedResult = mockTemplate.queryForList(query, params);

        Assert.assertThat(returnedResult, CoreMatchers.sameInstance(mockResult));
    }

}

诀窍是使用ArgumentMatchers.<Object>any(),因为有多个queryForList方法实现,我们要模拟的方法接收一个varargs参数。

票数 3
EN

Stack Overflow用户

发布于 2020-12-22 19:04:17

下面是我在spring boot中使用的代码,mockito

代码语言:javascript
复制
/** class on which uni test is driven **/
public class Decompile {


    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Map<String, Object>> getRunner()
    {
        try{
            return jdbcTemplate.queryForList("select * from users");
        } 
        catch (Exception e) {
            System.err.println(e);
        }
        return null;
    }

}

单元测试用例启动

代码语言:javascript
复制
/** Unit test case for above class **/
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.jdbc.core.JdbcTemplate;

@RunWith(MockitoJUnitRunner.class)
public class DecompileTest {

    @Mock/* works fine with autowired dependency too */
    JdbcTemplate jdbcTemplate;

    @InjectMocks/* for the claa that we are mocking */
    Decompile testclass;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testgetRunner() {
        List<Map<String, Object>> expectedresultList  = new ArrayList<>();
        Mockito.lenient().when(jdbcTemplate.queryForList("select * from users.. ")).thenReturn(expectedresultList);
        List<Map<String, Object>> response = testclass.getRunner();
    }

}

mvn包使用方法如下(兼容spring 2以上版本)

代码语言:javascript
复制
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-test</artifactId> 
    <scope>test</scope> 
</dependency> 

<dependency>
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-test</artifactId> 
    <scope>test</scope> 
</dependency> 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56015707

复制
相关文章

相似问题

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