Невозможно сохранить данные в базе данных H2 с помощью SpringBootTest и Spring JPA Repository - PullRequest
0 голосов
/ 09 апреля 2020

Я использую @SpringBootTest для проверки подлинности SpringSecurity c. Когда я проверяю ее, база данных h2 не сохраняет данные. Я не вижу оператора вставки в консоли, который я, очевидно, вижу при запуске мое реальное приложение SpringBoot и вставка данных из внешнего интерфейса. Пожалуйста, помогите.

Ниже приведен мой тест:

        @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
        @ContextConfiguration(classes=ConnectionsAppApplication.class)
        @Transactional
        public class AuthenticationTest {

            @Autowired
            private WebApplicationContext context;

            private MockMvc mockMvc;

            @Mock
            CustDetailsRepository custRepository;

            @Mock
            BCryptPasswordEncoder encrypt;

            @InjectMocks
            CustomerServiceImpl customerServiceImpl;



           @BeforeEach
           public void setup() {

             MockitoAnnotations.initMocks(this);
             mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
           }


          @Test
          void testAuthentication() {

              CustomerDetails customer = new CustomerDetails();
              customer.setEmailid("abc.com");
              customer.setPassword("abc@123456");
              customerServiceImpl.saveUser(customer);
           try {
               this.mockMvc.perform(get("/api/login")
               .with(httpBasic("abc.com","abc@123456")))
               .andDo(print())
               .andExpect(status().isOk())
               .andReturn();
           } catch (Exception e) {
                e.printStackTrace();
            }
         }

       }

Метод saveUser в классе CustomerServiceImpl:

        public void saveUser(CustomerDetails customerDetails) {
          customerDetails.setPassword(bCryptPasswordEncoder.encode(customerDetails.getPassword()));
          custDetailsRepository.save(customerDetails);
         }

1 Ответ

0 голосов
/ 09 апреля 2020

У вас есть 2 варианта для реализации этого теста:

Вариант 1: использовать реальное h2

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes=ConnectionsAppApplication.class)
@Transactional
public class AuthenticationTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @Autowired
    CustomerServiceImpl customerServiceImpl;

    @BeforeEach
    public void setup() {

        mockMvc = MockMvcBuilders
            .webAppContextSetup(context)
            .apply(springSecurity())
            .build();
    }


    @Test
    void testAuthentication() {

        CustomerDetails customer = new CustomerDetails();
        customer.setEmailid("abc.com");
        customer.setPassword("abc@123456");
        customerServiceImpl.saveUser(customer);
        try {
             this.mockMvc.perform(get("/api/login")
                 .with(httpBasic("abc.com","abc@123456")))
                 .andDo(print())
                 .andExpect(status().isOk())
                 .andReturn();
         } catch (Exception e) {
             e.printStackTrace();
         }
    }
}

Вариант 2: макетировать вашу службу / хранилище

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes=ConnectionsAppApplication.class)
@Transactional
public class AuthenticationTest {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mockMvc;

    @MockBean
    CustomerServiceImpl customerServiceImpl;

    @BeforeEach
    public void setup() {
        mockMvc = MockMvcBuilders
            .webAppContextSetup(context)
            .apply(springSecurity())
            .build();
    }


    @Test
    void testAuthentication() {
        // set expectations on CustomerServiceImpl
        CustomerDetails customer = new CustomerDetails();
        customer.setEmailid("abc.com");
        customer.setPassword("abc@123456");
        // mock the method you use to fetch the customer
        when(customerServiceImpl.getUser("abc.com").thenReturn(customer);
        try {
            this.mockMvc.perform(get("/api/login")
                .with(httpBasic("abc.com","abc@123456")))
                .andDo(print())
                .andExpect(status().isOk())
                .andReturn();
           } catch (Exception e) {
                e.printStackTrace();
           }
      }
}

Обратите внимание, что вы также можете использовать @WebMvcTest для тестирования только веб-фрагмента вашего приложения (это означает, что никакие другие bean-компоненты не будут созданы, например, должны быть доставлены все sercies, от которых вы зависите в контроллере) @MockBean)

...