我的 spring-data-jpa 后端有一个类,它使用大量测试数据填充(测试)数据库。该类使用spring数据存储库来创建实体。我的所有实体都有一个用@CreatedData
注释的字段和模型类上相应的@EntityListeners(AuditingEntityListener.class)
注释。这到目前为止工作正常。 dateCreated自动设置正确。
但是当运行 Junit测试时,我有时需要使用dateCreated创建一个(测试)对象。我该如何存档?只能通过普通的JDBC?
答案 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)
我不知道您正在使用的确切测试用例,但我可以看到一些解决方案: