Как сделать мои данные sql доступными для всех новых транзакций в моем Junit? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь создать тестовый пример 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 данные, доступные для новой транзакции?

1 Ответ

1 голос
/ 05 марта 2020

Вы пытались явно установить transactionMode в ISOLATED в вашей аннотации @sql? Это может помочь гарантировать, что вставки фиксируются до того, как ваш метод теста будет выполнен. IE

@Sql(value = {"classpath:sql/create_foo_data.sql"},
    executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD,
    config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...