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.