我正在尝试用spring boot应用程序编写我的第一个集成测试。因此,为了编写正确的测试用例,我使用spring提供的@Transactional,以便在执行测试之前和之后,我的内存数据库的状态保持不变。 事情是@Transactional正在按预期工作我的测试执行开始它插入一些数据用于测试到db并且当执行完成它回滚由它完成的更改但问题是当测试执行转到我正在测试的代码尝试获取数据通过测试持续存在,但在那里找不到任何数据。我已经分享了我的代码以便更好地理解。
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class MyFirstControllerTest {
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private MyFirstRepository myFirstRepo;
@Test
public void testMethod() {
//insert some data.
Dummy data = new DummyData();
myFirstRepo.save(data);
//hits the rest route to get data.
ResponseEntity<String> response =
this.restTemplate.getForEntity("/dummys", String.class); // did not find any data in db.
myFirstRepo.findAll(); //working - fetched the data inserted in test.
}
}
以下是我的控制器。
@Controller
@Validated
public class MyFirstController {
@Autowired
private MyFirstRepository myFirstRepo;
@GetMapping("/dummys")
public ResponseEntity<List<DummyDataDto>> getDummyData() {
List<DummyData> data = myFirstRepo.findAll(); //does not finds any data
//convert list of dummy data to list of dummydata dto.
return new ResponseEntity<DummyDataDto>(List<DummyDataDto>, HttpStatus.OK);
}
}
答案 0 :(得分:0)
这是因为您一直在使用的内存数据库中的隔离级别。我假设该数据库的默认隔离级别为 Read Committed 。
如果您使用H2,则可能会找到隔离级别here.
的详细信息
如果您的业务要求是这样做的话, 使用Read Uncommited隔离级别 进行集成测试只需
。