2017-02-21 64 views
1

My spring-data-jpa backend имеет класс, который заполняет базу данных (test) множеством тестовых данных. Класс usese использует репозитории данных для создания объектов. Все мои объекты имеют поле, аннотированное @CreatedData и соответствующую аннотацию @EntityListeners(AuditingEntityListener.class) в классе модели. Пока это прекрасно. dateCreated автоматически устанавливается правильно.Как установить @CreatedDate в прошлом (для тестирования)

Но при запуске Junit test Мне иногда нужно создать (тестовый) объект с датой, созданной в прошлом. Как я могу архивировать это? Только через простой JDBC?

+0

(не) быстрый и грязный способ: 'Thread.sleep (1000)' – OrangeDog

+0

Связанный: http://stackoverflow.com/q/12155632/476716 – OrangeDog

+0

Мне нужен Созданный месяц в прошлом :-) Спасибо для ссылки. Я уже опасался, что весеннее решение будет «большим». – Robert

ответ

1

я нашел способ, который работает для меня (используя обычный JDBC):

Сначала я создаю свои объекты домена для тестирования с пружинным-данных 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 внутри возвращаемого класса модели.

0

Я не знаю точно тест, который вы используете, но я могу видеть несколько решений:

  • создать фиктивный объект после того, как dateCreated называется дата возвращения месяц назад
  • возможно использовать в -MEM дб, заполнить его с датой перед испытанием
  • идти с АОП по ссылке, предоставленной в комментариях
+0

Благодарим вас за предложения: MockObjects: Мне нужны записи hundrests каждый с разными датами создания в моей БД. InMemoryDB: Это то, что я использую. Я заполняю его своим TestDataCreator.java. Я создаю свои тестовые данные в java (вместо простого sql в файле data.sql), потому что мне нужно манипулировать множеством ссылок между записями тестовых данных. – Robert