не могу найти сохраненную сущность в тесте - PullRequest
0 голосов
/ 21 января 2019

Я тестирую свое весеннее приложение, но есть проводная вещь. Я не могу понять, почему это происходит.

в моем весеннем коде я сохраняю requestBody в БД, используя crudRepository. и я мог бы найти сохраненный элемент с crudRepository. но когда я запускаю unittest и вызываю тот же метод с TestRestTemplate, я не могу найти сохраненный элемент с crudRepository.

Сервер

@PostMapping("")
    public Question saveQuestion(@RequestBody Question question) {
        questionRepository.save(question);

        for(Question _p:questionRepository.findAll()) {
            Application.LOG.info("[saveQuestion] "+_p.toString());
        }
        // I can find saved Question
        return question;
    }

UnitTest

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Transactional
public class QuestionControllerTest {
    @Autowired TestRestTemplate restTemplate;
    @Autowired QuestionRepository questionRepository;
@Test
    public void addNewQuestionTest() throws InterruptedException {
        String json= "{\"uniqueId\":1}";

        HttpEntity<String> req = new HttpEntity<>(json, headers);

        ResponseEntity<Question> response = restTemplate.postForEntity("/question", req, Question.class);

        for(Question _p:questionRepository.findAll()) {
            Application.LOG.info("[addNewQuestion]"+_p.toString());
        }
        // I can't find saved question.
    }
}

журнал выглядит следующим образом.

[saveQuestion] Question(0)
[saveQuestion] Question(1)
[addNewQuestionTest] Question(0)

но я исключил

[saveQuestion] Question(0)
[saveQuestion] Question(1)
[addNewQuestionTest] Question(0)
[addNewQuestionTest] Question(1)

Я проверил, что в БД есть данные, и метод saveQuestion печатает 2 элемента. но в методе addNewQuestionTest есть только 1 элемент.

Я что-то упустил?

1 Ответ

0 голосов
/ 21 января 2019

Это всего лишь предположение, но здесь может произойти следующее:

1) Вы пометили весь тест для выполнения в определенной транзакции:

@Transactional
public class QuestionControllerTest {

2) Когда вы нажимаете метод post, он сохраняет сущность, но в рамках своей собственной / новой транзакции

ResponseEntity<Question> response = restTemplate.postForEntity("/question", req, Question.class);

Здесь все еще активна транзакция из 1), поэтому у вас есть 2 транзакции.

3) Поскольку сохранение было выполнено в отдельной транзакции, в то время как первая еще активна, первая еще не имеет доступа к данным, сохраненным транзакцией 2).

Решение

Поскольку репозитории Spring JPA по своей природе являются транзакционными, я бы удалил @Transactional из тестовой конфигурации.

Теперь, когда вы нажмете questionRepository.findAll(), это вызовет новую транзакцию, которая будет иметь доступ к данным, сохраненным в первой транзакции, сохраняя вопросник.

...