Spring Boot - Spring Data - Джерси - Нет результатов работы репозиториев во время интеграционного теста JUnit - PullRequest
0 голосов
/ 05 сентября 2018

долго боролся с этой проблемой, и у меня странное чувство, что оно как-то связано с тем, как я устанавливаю свою аннотацию @Transactional.

Так что я хочу сделать?

  1. Я готовлю некоторые данные и сохраняю их с доступными репозиториями в базе данных.

Это можно найти здесь, в моем классе FormTest в prepareExampleApplication методе

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class FormTest {

    @Autowired
    private ApplicationRepository applicationRepository;

    @Autowired
    private AppActionRepository appActionRepository;

    @Autowired
    private RoleRepository roleRepository;

    @Autowired
    private TestRestTemplate restTemplate;

    @Autowired
    private FormRepository formRepository;

    @Autowired
    private FormElementRepository formElementRepository;

    @Autowired
    private SectionRepository sectionRepository;

    private Application application;
    private InputField refInputField;
    private Select refSelectBox;

    @Before
    public void prepareExampleApplication() {

        Form form = formRepository.save(ModelFactory.getForm("Project"));

        Application application = ModelFactory.getApplication("Example", form);

        this.application = applicationRepository.save(application);

        Role role = new Role();
        role.setRoleName("ADMIN");
        role.setApp(application);

        role = roleRepository.save(role);

        Section section = ModelFactory.getSection(form, null, null);

        section = formElementRepository.save(section);

        InputField inputField = ModelFactory.getInputField(form, section, section);

        refInputField = formElementRepository.save(inputField);
        //once again. Just for my own eyes to see if it is there
        Iterable<Form> all = formRepository.findAll();

       // lot more stuff


    }


    @Test
    @Transactional
    public void testUserInput() {

        // first create a new container to give inouts

        Long id = this.application.getEntity().getId();
        // for the sake of debugging I am using the formRepo to really SEARCH for the persisted form AND IT IS THERE!!!
        Form byId = formRepository.findById(id).orElseThrow(NotFoundException::new);

        URI uri = this.restTemplate.postForLocation("/api/form/" + id + "/forminstance", null);
        long containerId = TestHelper.extractId(uri);


    }
}
  1. Следующее, что я делаю, имея эти данные, это использую restTemplate и отправляю пост-запрос в службу REST. Вы можете найти вызов POST в методе test. По причинам отладки - и чтобы увидеть, что репозиторий работает - я ДЕЙСТВИТЕЛЬНО использую репозиторий для получения идентификатора формы вместо того, чтобы использовать поле класса, которое было заполнено методом подготовки. И форма будет возвращена !!

  2. В моем сервисе отдыха я снова использую formRepository, ища сущность, которую я нашел ранее в тестовом классе. Но в этот раз хранилище ничего не возвращает. Только ноль. Я пробовал ОЧЕНЬ МНОГО разных вещей с установкой @Transactional в разных местах, но что бы я ни делал, formRepository в службе REST дает мне только 0 энтитов и ноль. Вот служба ОТДЫХА

    @Service
    @Api("FormService")
    @Path("/form")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public class FormService {
    
        @Autowired
        private FormInstanceRepository formInstanceRepository;
    
        @Autowired
        private FormRepository formRepository;
    
        @Autowired
        private FormElementRepository formElementRepository;
    
        @Autowired
        private UserInputRepository userInputRepository;
    
        @POST
        @Path("{id}/forminstance")
        @Transactional
        public Response createFormInstance(@Context UriInfo info, @PathParam("id") long formId) {
            // returns ALWAYS 0 elements
            Iterable<Form> all = formRepository.findAll(); 
            // returns always null       
            Form form = formRepository.findById(formId).orElse(null);
    
            FormInstance formInstance = new FormInstance();
            formInstance.setForm(form);
            FormInstance save = formInstanceRepository.save(formInstance);
    
            UriBuilder builder = info.getAbsolutePathBuilder();
            builder.path(Long.toString(save.getId()));
    
            return Response.created(builder.build()).build();
    
        }
    

    Если вы знаете ответ, мне действительно интересно объяснение, чтобы понять мою ошибку. Я использую в памяти H2 db для тестов.

Добавление сущности Form и FormRepository тоже

    @Entity
    @Data
    public class Form {

        @Id
        @GeneratedValue
        private Long id;

        private String name;

    }

-

    public interface FormRepository extends CrudRepository<Form, Long> {
    }

Заранее спасибо за помощь !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...