目前,Web 应用程序形式的服务尤其常见。很难想象某种网络应用程序不以任何方式存储数据。数据库是当今存储数据最常用的方式。
从服务端来看,任何数据库都像是一个外部集成。如果服务被测试覆盖,那就意味着需要对这个集成进行测试。有许多方法可以测试这种集成; 下面,我们将分析最流行的方法。
例如,使用基于 Spring Boot 的基本 CRUD Kotlin 服务。
CRUD Web 服务提供了通过 HTTP 请求从数据库中创建(C)、读取(R)、更新(U)、删除(D)实体的功能。
例如,我们将考虑一个没有删除和更新功能的服务——只保留创建和读取功能。因为,原则上,我们将涵盖这两种方法所需的所有内容。
H2用作数据库,但任何关系数据库都可以使用。由于我们只关注集成测试,因此本文的总体意图将与其他流行的关系数据库相关。
该示例中的服务的职责范围是与 pokeApi 集成,以根据名称获取有关口袋妖怪权重的信息。以及将此信息保存到数据库并提供获取所有保存记录的机会。
服务的主要功能使用以下依赖项:
org.springframework.boot
spring-boot-starter-data-jdbc
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.module
jackson-module-kotlin
org.jetbrains.kotlin
kotlin-reflect
org.jetbrains.kotlin
kotlin-stdlib-jdk8
com.h2database
h2
runtime
The table for storing information about the weight of a Pokémon in the application's database looks like this:
用于在应用程序数据库中存储Pokémon重量信息的表如下所示:
create table pokemon (
id integer primary key auto_increment,
name varchar(25),
weight integer
);Id - Identity 字段
name - 一个用于存储有关口袋妖怪名称信息的字段
weight- 一个包含有关口袋妖怪重量信息的字段。
Web 服务有两个端点,它们具有需要测试覆盖的功能。
POST/pokemon - 将模型保存到数据库中。
模型有2个必需的字段-name (String)和 weight (Integer)。
举个例子:
###
POST http://localhost:8080/pokemon
Content-Type: application/json
{
"name": "bulbasaur",
"weight": 69
}
GET/pokemon 是一个端点,负责提供数据库中的所有记录。
作为响应,该方法返回一个包含3个字段的模型数组-id (Long)、 name (String)、 weight (Integer)。
举个例子:
###
GET http://localhost:8080/pokemon
response:
[
{
"id": 1,
"name": "bulbasaur",
"weight": 69
},
{
"id": 2,
"name": "ditto",
"weight": 40
}
]控制器代码:
@RestController
@RequestMapping("/pokemon")
class PokemonController(private val pokemonDao: PokemonDao) {
@PostMapping
fun savePokemon(@RequestBody pokemon: Pokemon) {
pokemonDao.save(pokemon)
}
@GetMapping
fun getAll(): List = pokemonDao.getAll()
@ExceptionHandler
fun handleException(exception: Exception): ResponseEntity<*> {
return ResponseEntity(exception.message, HttpStatus.BAD_REQUEST)
}
} DAO (数据访问对象)层完全负责与存储库的集成。JdbcTemplate 用于描述数据库集成。JdbcTemplate 是一个 Spring 库,它允许您用本机 SQL 编写查询。
为了便于映射实体,使用了常规 objectMapper。在重负载下,这样的映射可以更改为更优的映射。
DAO 层如下所示:
@Service
class PokemonDao(private val jdbcTemplate: JdbcTemplate, private val objectMapper: ObjectMapper) {
fun save(pokemon: Pokemon) {
jdbcTemplate.update(SAVE_POKEMON, pokemon.name, pokemon.weight)
}
fun getAll(): List =
jdbcTemplate.queryForList(SELECT_ALL_POKEMONS)
.map { objectMapper.readValue(objectMapper.writeValueAsString(it), Pokemon::class.java) }
}
@Language("Sql")
private const val SAVE_POKEMON = "insert into pokemon values(default, ?, ?)"
@Language("Sql")
private const val SELECT_ALL_POKEMONS = "select * from pokemon" 数据库参数可以在 Web 服务之外和 application.properties 中配置:
spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2DialectDDL 可以包含在 schema. sql 中
总之,我们已经考虑了使用 H2 + Spring Boot 的例子来实现 Web 服务与数据库集成的基本方法。
如何测试数据库集成?我将很高兴在评论中听到你们关于如何将 Web 服务与数据库集成的想法。
资源可以在我的 GitHub 存储库中找到: pokemon-app
https://github.com/v-aksenov/pokemon-app
| 留言与评论(共有 0 条评论) “” |