使用数据库测试 spring boot api

问题描述 投票:0回答:2

我想自动测试我的 spring api。现在我有大约 7-8 个有趣的情况并做出:

  1. 部署在 postgres 7 db (test1, 2, ....)
  2. application.properties写入db test1。
  3. 运行测试并转到2。

这很难。有什么简单的方法吗?

  1. 我想要一个数据库用于测试(清除数据库,只有表结构)
  2. 在测试写入数据库装置之前(包含数据的特殊文件,示例 - 用户、报告等)
  3. 运行测试
  4. 测试后删除fixture并再次清除数据库。

我可以在春天之前完成吗?早期我用 python/django 编程并使用类似的方式。

java spring spring-data-jpa
2个回答
1
投票

我认为解决这个问题的一种方法是通过自定义属性文件和@Configuration类。

您将为每个测试创建属性文件,例如test1-dbA.properties

jdbc.driverClassName=org.h2.Driver
jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
jdbc.username=db1
jdbc.password=..

接下来,您将定义从 test1-dbA.properties

加载属性的 DataSource bean
@Configuration
@EnableJpaRepositories(basePackages = "org.baeldung.repository")
@PropertySource("test1-dbA.properties")
@EnableTransactionManagement
public class DB1Config {
        @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));

        return dataSource;
    }
// ...
}

在 JUnit 测试中,您将加载配置类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {Application.class, DB1Config.class})
public class db1Test{
    // ...
}

可以在此处查找此选项和其他选项:https://www.baeldung.com/spring-testing-separate-data-sourcehttps://www.baeldung.com/spring-jpa-test-内存数据库


0
投票
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable String id) {
        return userRepository.findById(id).orElse(null);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.