我在Stackoverflow和其他地方看到了类似的例子,但它对我不起作用.我使用spring boot数据jpa,junit5,h2数据库并试图进行简单的验收测试.测试OK,但我希望数据库中的更改在测试后恢复,但它们仍然保持提交状态.在测试中,我在数据库中创建一行,在其他测试中,我删除一行. 下面是我的代码层: 测试:
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ControllerAcceptanceTest {
@LocalServerPort
int randomServerPort;
private RestTemplate restTemplate;
private String url;
@BeforeEach
void setUp() {
restTemplate = new RestTemplate();
}
@Test
@Transactional
@Rollback
void testCreate() throws Exception {
url = "http://localhost:" + randomServerPort + "/api/wallet/create";
UUID uuid = UUID.randomUUID();
PlayerDto playerDto = new PlayerDto();
playerDto.setPlayerId(String.valueOf(uuid));
ResponseEntity responseEntity = restTemplate.postForEntity(url, playerDto, Object.class);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
}
@Test
@Transactional
@Rollback
void testDelete() throws Exception {
url = "http://localhost:" + randomServerPort + "/api/wallet/delete";
WalletDto walletDto = new WalletDto();
walletDto.setWalletId("1");
ResponseEntity responseEntity = restTemplate.postForEntity(url, walletDto, Object.class);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
}
}
控制器:
@PostMapping (path = "/create", consumes = MediaType.APPLICATION_JSON_VALUE)
public void createWallet(@RequestBody PlayerDto playerDto) throws PlayerIdRedundantException {
walletService.createWallet(playerDto.getPlayerId());
}
@PostMapping (path = "/delete", consumes = MediaType.APPLICATION_JSON_VALUE)
public void deleteWallet(@RequestBody WalletDto walletDto) throws PlayerIdRedundantException {
walletService.deleteWallet(walletDto.getWalletId());
}
服务:
@Transactional
public void createWallet(String playerId) throws PlayerIdRedundantException {
checkPlayerId(playerId);
Wallet wallet = Wallet.builder()
.playerId(playerId)
.balance(BigDecimal.valueOf(0))
.build();
walletRepository.save(wallet);
}
@Transactional
public void deleteWallet(String walletId) throws PlayerIdRedundantException {
Wallet wallet = walletRepository.findById(Long.valueOf(walletId)).orElseThrow();
walletRepository.delete(wallet);
}
应用程序.属性:
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:file:./src/main/resources/data/testdb;AUTO_SERVER=TRUE;OLD_INFORMATION_SCHEMA=TRUE
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.generate-ddl=true