如何使用 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 控制器编写单元测试类的主要内容,如果未能解决你的问题,请参考以下文章
如何修复数据转换错误:jdbcTemplate.update,将 Enum 写入 H2 数据库
如何使用 JdbcTemplate 在 Spring 中简洁地调用 PL/SQL 过程并返回其输出变量?
带有 TransactionTemplate 和 Connection Pool 的 JDBCTemplate,使用哪个数据源