Запросы с использованием Spring jpa Cucumber JUnit в автоматизированном тестовом проекте

#spring #spring-data-jpa #spring-data #cucumber-junit #cucumber-spring

#spring #spring-data-jpa #spring-данные #cucumber-junit #cucumber-spring

Вопрос:

Я пытался создать автоматический тест, в котором я мог бы запрашивать у базы данных статус заказа, который я создаю с помощью пользовательского интерфейса (Appium) на устройстве (Android или IOS).

Я хотел бы выполнить crud с базой данных, используя spring jpa, поскольку мне сказали, что это лучшая практика.

Я пытался это реализовать, но при объявлении объекта репозитория он всегда достигает null, поэтому он никогда не использует метод репозитория, который я создал. У меня есть следующая последовательность.

Бегун (JUnit) -> Функция (Корнишон) —> Определения шагов —> Шаги.

OrderWithouUsingDelayOptionCashiOSTest.java (Бегун)

 import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;

@RunWith(Cucumber.class)
@SpringBootTest
@CucumberOptions(
    plugin = {"pretty", "com.rappi.setup.reports.TestListener"},
    features = {"classpath:com/rappi/features/orders/order_restaurant_ios.feature"},
    glue = {"com.rappi.glue.hooks", "com.rappi.definitions"},
    tags = "@iOSTest and @Cash")
public class OrderWithoutUsingDelayOptionCashiOSTest {}
 

order_restaurant_ios.feature

 #language: es
@iOSTest @After-restaurant-order @AfterLogoutMS
Característica: Crear orden SIN usar la opción del delay ¿Quieres Modificar algo? con diferentes metodos de pago - iOS

  Antecedentes: Autenticacion del usuario y creacion de carrito por ms
    Dado que el proceso de autenticacion del usuario se completo en el pais de: Colombia
    Y que se tiene el producto 810017633 de la tienda 900102662 agregado en canasta
.
.
.
Other things
 

LoginRappiDefinition.java (определения шагов)

   @Cuando("^que el proceso de autenticacion del usuario se completo en el pais de: (.*)$")
  public void completeUserLogin(String country) {
    loginRappiStep.selectLocationCountry(country);
  }
 

LoginRappiStep.java (Шаг).

В этом классе объект OrderRepository всегда достигает null, поэтому он никогда не вызывает метод «getOne (order)».

 public class LoginRappiStep {

  @Autowired public OrderRepository orderRepository;

  public void selectLocationCountry() {
    long order = 5019023;
    Order orderEntity = orderRepository.getOne(order);
  }

}
 

Order.java (Сущность)

 
import javax.persistence.*;

@Entity
@Table(name = "orders")
public class Order {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column private String state;

  public Order(Long id, String state) {
    this.id = id;
    this.state = state;
  }

  public Long getId() {
    return id;
  }

  public Order setId(Long id) {
    this.id = id;
    return this;
  }

  public String getState() {
    return state;
  }

  public Order setState(String state) {
    this.state = state;
    return this;
  }
}
 

OrderRepository.java

 import com.rappi.entities.Order;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface OrderRepository extends JpaRepository<Order, Long> {

  Optional<Order> findById(Long id);

  Order getOne(Long id);
}
 

build.gradle

 dependencies {
    testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.3.4.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.3.4.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.3.4.RELEASE'
}
 

application.properties

 spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://postgres-core-orders.dev.com:5432/grability
spring.datasource.username=sa
spring.datasource.password=sa
 

Кто-нибудь знает, что еще я должен делать, что я упускаю из виду?
Это не проект spring, это обычный java-проект.

Я ценю любую помощь, которую вы можете мне оказать.

Ответ №1:

Вы аннотировали неправильный класс @SpringBootTest . Попробуйте:

 package com.rappi.config

import org.springframework.boot.test.context.SpringBootTest;

import io.cucumber.spring.CucumberContextConfiguration;

@CucumberContextConfiguration
@SpringBootTest
public class CucumberSpringConfiguration {

}
 

И убедитесь, что CucumberSpringConfiguration он находится на пути склеивания, добавив его в:

 glue = {"com.rappi.config", "com.rappi.glue.hooks", "com.rappi.definitions"},
 

Cucumber использует Springs TestContextManager . Класс, аннотированный с @CucumberContextConfiguration помощью, будет использоваться для создания контекста тестового приложения. Таким образом, любые другие аннотации, которые вы добавите CucumberSpringConfiguration , также будут подобраны Spring.

Смотрите: https://github.com/cucumber/cucumber-jvm/blob/main/spring /

Комментарии:

1. Вы также можете найти пример здесь: github.com/RedFroggy/spring-cucumber-rest-api