我使用Spock和Spring Framework爲我的應用程序編寫集成測試。Groovy - 集成測試
我想在每次測試前保存一些對象,並在每次測試後刪除所有對象。
但問題在於,每次測試後都不會刪除由Hibernate生成的ID。當我在第一次測試之前創建2個對象時,Hibernate生成id 1和2,並且當我爲test 1和2運行測試findById時,測試成功。但是,對於ID爲1,2下一個測試是不是成功,因爲在數據庫中的對象具有ID 3和4
這裏是我的代碼:
@ContextConfiguration
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ControllerSpec extends Specification {
@Autowired
private TestRestTemplate restTemplate
@Autowired
private MyRepository repository
private EntityDTO dto
private MyEntity entity1
private MyEntity entity2
@Before
void set() {
this.entity1 = new MyEntity(1L)
this.entity2 = new MyEntity(2L)
this.dto = new EntityDTO()
repository.save(this.entity1)
repository.save(this.entity2)
}
@After
void clean() {
List<MyEntity> all = repository.findAll()
if (all != null || !all.isEmpty()) {
for (MyEntity entity : all) {
repository.delete(entity)
}
}
}
@Unroll
'findById test'() {
when:
def response = restTemplate.getForEntity(url, EntityDTO)
then:
response.getStatusCode() == statusCode
where:
url | statusCode
'/myurl/id/1' | HttpStatus.OK
'/myurl/id/2' | HttpStatus.OK
'/myurl/id/3' | HttpStatus.NOT_FOUND
}
而且我的控制器:
@GetMapping(value = "/id/{id}")
public ResponseEntity<EntityDTO> findById(@PathVariable Long id) {
final EntityDTO dto = service.findById(id);
if (dto != null) {
return new ResponseEntity<EntityDTO>(dto, HttpStatus.OK);
}
return new ResponseEntity<EntityDTO>(dto, HttpStatus.NOT_FOUND);
}
當我運行此代碼我得到一個錯誤:
Condition not satisfied:
response.getStatusCode() == statusCode | | | | | 404 | 200 | false <404 Not Found,{Content-Length=[0], Date=[Thu, 15 Jun 2017 16:07:21 GMT]}>
,當我點擊「看性差異」我看到的細節:預期:
groovy.lang.MissingFieldException: No such field: name for class: org.springframework.http.HttpStatus at groovy.lang.MetaClassImpl.getAttribute(MetaClassImpl.java:2820) ... at org.spockframework.runtime.JUnitSupervisor.convertToComparisonFailure(JUnitSupervisor.java:135)
實際是像預期與一個區別是相同的: 在
org.spockframework.runtime.JUnitSupervisor.convertToComparisonFailure(JUnitSupervisor.java:134)