【问题标题】:Update @Id (using identity strategy) in H2 JPA test在 H2 JPA 测试中更新 @Id(使用身份策略)
【发布时间】:2019-02-21 15:59:28
【问题描述】:

我有一个测试检查我使用 H2 进行测试的最后插入的 id

@Entity
@Data
public class Guy implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(nullable = false)
  protected Long id;
  @Column(nullable = false)
  protected String name;
}

这是测试

@Test
public void getTest() {
  String jsonResponse = "{\"name\":\"andrew\"}";
  Response response = given().body(jsonResponse).header("Content-Type", 
 "application/json").header("Client", 123).post("/thin/guy");

  assertEquals(HttpServletResponse.SC_CREATED,response.getStatusCode());
  //here the record was created

  JSONObject jsonObject = new JSONObject(response.getBody().print());
  Response resGet = given().header("Client",123).get("/thin/guy/"+String.valueOf(jsonObject.get("id")));
  assertEquals(HttpServletResponse.SC_OK, resGet.getStatusCode());

  //this is the response "{\"id\":1,\"name\":\"andrew\"}"
  JSONObject getGuy = new JSONObject(resGet.getBody().print());

  assertEquals(5000L,Long.valueOf(getGuy.get("id").toString()));
}

如何使仅在测试范围内运行的 H2database 返回插入的 id,其 de 值例如 5000。 是否可以在测试范围内为实体 Guy 设置星值?谢谢!

【问题讨论】:

  • 您可以将identity 种子设置为特定值。但我建议不要检查身份证。您应该检查除 ID 之外的所有其他值
  • 我在哪里可以设置de identity?在 pom 文件中?我知道.. ID.. 这是一种非常罕见的情况,但也有这种情况
  • 它是一个数据库操作。对于 MSSQL,它的 DBCC CHECKIDENT ('[TestTable]', RESEED, 0);

标签: java h2 jpa-2.0


【解决方案1】:

不要检查新创建对象的 ID 的实际值。

  • 没有理由检查 id。 id 由数据库引擎生成,但您在测试期间使用不同的引擎,因此您的测试用例将测试您的测试环境的行为...
  • 测试可以按随机顺序运行,因此当您添加更多测试或更改测试数据时,您的旧测试将开始失败。

如果你真的想测试一些东西,那么测试新创建的对象的属性(如XtremeBaumer 建议的那样)。 或者你可以测试创建时返回的对象是否和GET请求时返回的对象完全一样。

assertEquals(jsonObject, testGuy);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2021-08-22
    • 1970-01-01
    • 2020-07-03
    • 2016-12-17
    相关资源
    最近更新 更多