为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Mockito 模拟 Spring 的 JdbcTemplate.query

如何使用 Mockito 模拟 Spring 的 JdbcTemplate.query

青春有我 2022-11-10 15:08:57
我想知道如何使用 Mockito 模拟特定代码:List<Map<String, Object>> list = jdbcTemplate.queryForList(    sqlQuery,     new Object[] { inflowId });我尝试了以下代码:Mockito.doReturn(list)       .when(jdbcTemplate)       .queryForList(Mockito.anyString(), Mockito.any(Class.class));和:when(    jdbcTemplate.queryForList(Mockito.anyString(), Mockito.any(Object[].class))).thenReturn(list);我的问题是特定方法在 JUnit 中没有被嘲笑。调用该方法时,它会返回null,而它应该返回列表。
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

这应该有效:


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方法实现,我们要模拟的方法接收一个可变参数。


查看完整回答
反对 回复 2022-11-10
?
HUX布斯

TA贡献1876条经验 获得超6个赞

以下代码我与spring boot一起使用,mockito


/** 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;

    }


}

单元测试用例开始


/** 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)


<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> 


查看完整回答
反对 回复 2022-11-10
  • 2 回答
  • 0 关注
  • 270 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信