Groovy - 集成测试

时间:2017-06-15 16:22:44

标签: java spring hibernate groovy

我使用Spock和Spring Framework为我的应用程序编写集成测试。

我希望在每次测试之前保存一些对象,并在每次测试后删除所有对象。

但问题是每次测试后都不会删除Hibernate生成的id。当我在第一次测试之前创建2个对象时,Hibernate生成id 1和2,当我为id 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);
    }

当我运行此代码时出现错误:

  

条件不满意:

     

response.getStatusCode()== statusCode | | | | |   404 | 200 | false&lt; 404不   发现,{Content-Length = [0],Date = [Thu,2017年6月15日16:07:21 GMT]}&gt;

当我点击'See diference'时,我会看到详细信息:预期:

  

groovy.lang.MissingFieldException:没有这样的字段:类的名称:   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)

1 个答案:

答案 0 :(得分:2)

您可以使用在持久保存时分配的ID,而不是硬编码测试中的ID。

...
url                       | statusCode
"/myurl/id/${entity1.id}" | HttpStatus.OK
...