Saltar al contenido

¿Cómo crear una instancia de la interfaz CrudRepository durante las pruebas en Spring?

Posterior a observar en varios repositorios y sitios al terminar nos encontramos con la resolución que te mostramos a continuación.

Solución:

Esto es lo que he encontrado es la configuración mínima para una prueba de controlador de resorte que necesita una configuración de repositorio JPA con cableado automático (usando Spring-Boot 1.2 con resorte incorporado 4.1.4.RELEASE, DbUnit 2.4.8).

La prueba se ejecuta en una base de datos HSQL incorporada que se completa automáticamente con un archivo de datos xml al inicio de la prueba.

La clase de prueba:

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration( classes =  TestController.class,
                                   RepoFactory4Test.class  )
@TestExecutionListeners(  DependencyInjectionTestExecutionListener.class,
                           DirtiesContextTestExecutionListener.class,
                           TransactionDbUnitTestExecutionListener.class  )
@DatabaseSetup( "classpath:FillTestData.xml" )
@DatabaseTearDown( "classpath:DbClean.xml" )
public class ControllerWithRepositoryTest

    @Autowired
    private TestController myClassUnderTest;

    @Test
    public void test()
    

    @Component
    static class TestController
    
        @Autowired
        private UserRepository myUserRepo;

        /**
         * @return
         */
        public Iterable findAll()
        
            return myUserRepo.findAll();
        
    

Notas:

  • @ContextConfiguration anotación que solo incluye TestController integrado y la clase de configuración JPA RepoFactory4Test.

  • La anotación @TestExecutionListeners es necesaria para que las anotaciones posteriores @DatabaseSetup y @DatabaseTearDown tengan efecto

La clase de configuración a la que se hace referencia:

@Configuration
@EnableJpaRepositories( basePackageClasses = UserRepository.class )
public class RepoFactory4Test

    @Bean
    public DataSource dataSource()
    
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType( EmbeddedDatabaseType.HSQL ).build();
    

    @Bean
    public EntityManagerFactory entityManagerFactory()
    
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl( true );

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter( vendorAdapter );
        factory.setPackagesToScan( EUser.class.getPackage().getName() );
        factory.setDataSource( dataSource() );
        factory.afterPropertiesSet();

        return factory.getObject();
    

    @Bean
    public PlatformTransactionManager transactionManager()
    
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory( entityManagerFactory() );
        return txManager;
    

El UserRepository es una interfaz simple:

public interface UserRepository extends CrudRepository

   

El EUser es una clase anotada de @Entity simple:

@Entity
@Table(name = "user")
public class EUser

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Max( value=Integer.MAX_VALUE )
    private Long myId;

    @Column(name = "email")
    @Size(max=64)
    @NotNull
    private String myEmail;

    ...

El FillTestData.xml:



    [email protected]"
          ...
    />

El DbClean.xml:



    

Si está utilizando Spring Boot, puede simplificar un poco estos enfoques agregando @SpringBootTest para cargar en tu ApplicationContext. Esto le permite realizar el autowire en sus repositorios de datos de primavera. Asegúrese de agregar @RunWith(SpringRunner.class) por lo que se recogen las anotaciones específicas de primavera:

@RunWith(SpringRunner.class)
@SpringBootTest
public class OrphanManagementTest 

  @Autowired
  private UserRepository userRepository;

  @Test
  public void saveTest() 
    User user = new User("Tom");
    userRepository.save(user);
    Assert.assertNotNull(userRepository.findOne("Tom"));
  

Puede leer más sobre las pruebas en Spring Boot en sus documentos.

Si te sientes incitado, puedes dejar un tutorial acerca de qué le añadirías a este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *