如何在过去设置@CreatedDate(用于测试)

时间:2017-02-21 17:47:36

标签: spring jpa testing spring-data-jpa

我的 spring-data-jpa 后端有一个类,它使用大量测试数据填充(测试)数据库。该类使用spring数据存储库来创建实体。我的所有实体都有一个用@CreatedData注释的字段和模型类上相应的@EntityListeners(AuditingEntityListener.class)注释。这到目前为止工作正常。 dateCreated自动设置正确。

但是当运行 Junit测试时,我有时需要使用dateCreated创建一个(测试)对象。我该如何存档?只能通过普通的JDBC?

3 个答案:

答案 0 :(得分:3)

如果您使用的是Spring Boot,则可以模拟EnableJpaAuditing批注中使用的dateTimeProvider bean。 Spring Data使用此bean在实体创建/修改时获取当前时间。

@Import({TestDateTimeProvider.class})
@DataJpaTest
@EnableJpaAuditing(dateTimeProviderRef = "testDateTimeProvider")
public class SomeTest {

    @MockBean
    DateTimeProvider dateTimeProvider;

...

有必要定义实际的testDateTimeProvider bean,但是完全不会使用它,因为您将使用模拟。 之后,您可以照常编写mockito方法:

@Test
public void shouldUseMockDate() {

    when(dateTimeProvider.getNow()).thenReturn(Optional.of(LocalDateTime.of(2020, 2, 2, 0, 0, 0)));
    
   
   ... actual test assertions ...

答案 1 :(得分:2)

我发现了一种适合我的方式(使用普通JDBC):

首先,我使用spring-data-jpa创建我的域对象以进行测试:

MyModel savedModel = myRepo.save(myModel);

自动填充" dateCreated"时间戳为"现在"。由于我需要过去的创建日期进行测试,因此我使用普通JDBC手动调整它们:

@Autowired
JdbcTemplate jdbcTemplate;

[...]

// This syntax is for H2 DB.  For MySQL you need to use DATE_ADD
String sql = "UPDATE myTable SET created_at = DATEADD('DAY', -"+ageInDays+", NOW()) WHERE id='"+savedLaw.getId()+"'";
jdbcTemplate.execute(sql);
savedModel.setCreatedAt(new Date(System.currentTimeMillis() - ageInDays* 3600*24*1000);

不要忘记在返回的模型类中设置setCreatedAt。

答案 2 :(得分:0)

我不知道您正在使用的确切测试用例,但我可以看到一些解决方案:

  • 创建一个模拟对象,一旦dateCreated被称为返回日期 一个月前
  • 也许使用in-mem db,在测试前用日期填充
  • 从评论
  • 中提供的链接获取AOP