Я пытаюсь создать тестовый пример Junit. У меня есть метод create, который вызывается из моего метода процессора, который создает и сохраняет объект в новой транзакции. Проблема в том, что данные, которые я загружаю в свой sql, недоступны для новой транзакции.
Метод процессора:
public void updateFoo(final Test test) throws ProcessingException {
//Business logics
Foo foo = this.fooHelper.createAndSaveFoo(test);
//other business logics
foo.setName ("Name");
...
...
}
Вспомогательный метод:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Foo createAndSaveFoo(final Test test) throws NotFoundException, BadRequestException {
if (this.isFooPresent(test)) {
throw new BadRequestException(LOGGER, "CANNOT_CREATE_FOO", "Foo already created for the test");
}
final Foo foo = this.fooDAO.save(this.fooFactory.createFoo(test));
LOGGER.debug("Foo is saved successfully!, Entity@@ {}", foo);
return foo;
}
Заводской метод:
public Foo createFoo(final Test test) throws NotFoundException {
return Foo.FooBuilder.aFoo().
withId(test.getId()).
withDate((test.getDate()).
withSize(test.getSize()).
withType(getType(test.getTypeId()).
build();
}
private Type getType(final int id) throws NotFoundException {
return this.typeDAO.findById(id).orElseThrow(() -> new NotFoundException(LOGGER, TYPE_NOT_FOUND, "Invalid type id"));
}
Объект:
@Entity
@Table(name = "foo")
public class Foo {
@Column(name = "id")
private Long id;
@Column(name = "date")
private Date date;
@Column(name = "size")
private Long size;
@ManyToOne
@JoinColumn(name = "type", foreignKey = @ForeignKey(name = "fk__foo__type_id"))
private Type type;
//getters, setters and builders
}
@Entity
@Table(name = "type")
public class Type {
@Column(name = "id")
private Long id;
@Column(name = "date")
private String name;
//getters and setters
}
Метод тестирования:
@Test
@Transactional
@Sql(value = {"classpath:sql/create_foo_data.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(value = {"classpath:sql/clean_everything.sql"}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public void foo_test() throws ProcessingException {
//GIVEN
Test test = new Test();
test.setId(12);
test.setDate(new Date());
test.setSize(20);
test.setTypeId(1);
// WHEN
this.fooProcessor.updateFoo(test);
// THEN
final List<Foo> foo = this.fooDAO.findAll();
assertEquals(1, foo.size());
assertEquals(20, foo.get(0).getSize());
assertEquals("Test2", foo.get(0).getType().getName());
}
foo_data. sql
INSERT INTO `type` (`id`, `name`) VALUES (0, 'Test1'), (1, 'Test2');
Журналы:
com.deep.common.core.exception.NotFoundException: errorCode: 'TYPE_NOT_FOUND' - errorMessage : 'Invalid type id'
at com.deep.process.factory.entity.FooFactory.lambda$createFoo$0(FooFactory.java:55)
at java.util.Optional.orElseThrow(Optional.java:290)
Несмотря на то, что я вставил тип в мой sql, он не был получен, так как createAndSaveFoo () создал новую транзакцию. Как я могу получить мои sql данные, доступные для новой транзакции?