如何使用 JdbcTemplate 为我的 Rest 控制器编写单元测试类

Posted

技术标签:

【中文标题】如何使用 JdbcTemplate 为我的 Rest 控制器编写单元测试类【英文标题】:How to write unit test class for my Rest controller with JdbcTemplate 【发布时间】:2020-10-28 21:29:15 【问题描述】:

我是 Spring Boot 和 Junit 的新手。我在 Spring Boot 中有一个 Rest 服务,我在其中接收请求,使用请求参数查询数据库,接收查询结果并将其作为响应发送。

我的控制器代码是这样的:

@Autowired
JdbcTemplate mTemplate;

@GetMapping("/myservice")
    public String getGreeting2(@RequestParam(value = "name") String name) 
        //DO the query using mTemplate;
    

我的 JdbcTemplate 被实例化为像这样的单独类中的 bean

@Bean
public JdbcTemplate dataSource()
         BasicDataSource ds = new BasicDataSource();
         ds.setDriverClassName(....);
         ds.setUrl(...);
         ds.setUserName(...);
         ds.setPassword(...);
         return new JdbcTemplate(ds);

我的代码运行良好。

现在我想使用 JUnit4 为我的控制器编写单元测试。 我使用 MockMvc 发送请求,但我的单元测试从未起飞。 它总是抛出异常说,“无法解析 bean 数据源....无法加载合适的驱动程序类”

我尝试在 src/test/java 内的 application.properties 文件中提供数据源详细信息,但它不起作用。我想我错过了一些基本的过程。请指导我为具有数据源的休息控制器编写 junit 测试需要采取哪些步骤。像这样的:

@Runwith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MyRestControllerTest 

    @Autowired
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception 
        mvc.perform(MockMvcRequestBuilders.get("/myservice").param("name", "..."))
                .andExpect(status().isOk());
                
    

附: Rest控制器的主类中没有数据源,测试运行良好。

【问题讨论】:

不要对控制器进行单元测试,或者直接从控制器访问数据库。将应用程序分成具有不同职责的层 - 控制器仅用于请求和响应,而不是业务或持久性逻辑。您可以使用例如Testcontainers 可以轻松地为集成测试建立独立的数据库,这是一个更合适的级别,可以确保控制器与其他组件协同工作 【参考方案1】:

在这种情况下,您尝试做的是集成测试,请尝试在您的测试类中使用此注释:

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = Application.class)
    @WebAppConfiguration

但也许您只想对控制器进行测试,在这种情况下,您可以像这样模拟 JdbcTemplate:

    @InjectMocks
    private YourController yourController;

    @Mock
    private JdbcTemplate mTemplate;

    @Before
    public void before() 
        MockitoAnnotations.initMocks(this);
        MonitoringHelper.initMocks();
        intelligencePostFilter = new IntelligencePostFilter(intelligenceService);
        when(mTemplate.methodX()).thenReturn(....);
    

在这种情况下,测试类没有注释

【讨论】:

以上是关于如何使用 JdbcTemplate 为我的 Rest 控制器编写单元测试类的主要内容,如果未能解决你的问题,请参考以下文章

使用spring jdbctemplate更新一行

如何修复数据转换错误:jdbcTemplate.update,将 Enum 写入 H2 数据库

使用按钮背景颜色为我的按钮添加波纹效果?

如何使用 JdbcTemplate 在 Spring 中简洁地调用 PL/SQL 过程并返回其输出变量?

带有 TransactionTemplate 和 Connection Pool 的 JDBCTemplate,使用哪个数据源

从 POST 方法中使用 JDBCTemplate 存储对象数组 - Spring Boot