Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring-Boot module based integration testing

I have a multi-module Spring-Boot project. I was wondering how I can set up integration testing just to test Spring Data JPA repositories? The following approach fails with this exception: HV000183: Unable to load 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath.

Since this module does not depend on the web module, there is no web application that can be started.

@RunWith(SpringJUnit4ClassRunner.class)
@IntegrationTest
@SpringApplicationConfiguration(classes = TestConfiguration.class)
class CardInfoRepositoryIT {

    @Autowired CardInfoRepository cardInfoRepository;

    @Test
    void testLoadData() {
        assert cardInfoRepository.findAll().size() == 1
    }

}
like image 522
led Avatar asked Jan 24 '15 07:01

led


People also ask

What kind of testing can be done in spring test module?

Spring's integration testing support has the following primary goals: To manage Spring IoC container caching between tests. To provide Dependency Injection of test fixture instances. To provide transaction management appropriate to integration testing.

What is module integration testing?

Integration testing -- also known as integration and testing (I&T) -- is a type of software testing in which the different units, modules or components of a software application are tested as a combined entity. However, these modules may be coded by different programmers.


1 Answers

As Marten mentioned, @IntegrationTest should only be used when you need to test against the deployed Spring Boot application (e.g., deployed in an embedded Tomcat, Jetty, or Undertow container). So if your goal is to test your repository layer in isolation, you should not use @IntegrationTest.

On the other hand, if your tests require specific Spring Boot functionality (in contrast to standard Spring Framework functionality, semantics, and defaults), then you will in fact want to annotate your test class with @SpringApplicationConfiguration instead of @ContextConfiguration. The reason is that @SpringApplicationConfiguration preconfigures the SpringApplicationContextLoader which is specific to Spring Boot.

Furthermore, if you want your repository layer integration tests to run faster (i.e., without the full overhead of Spring Boot), you may choose to exclude configuration classes annotated with @EnableAutoConfiguration since that will auto-configure every candidate for auto-configuration found in the classpath. So, for example, if you just want to have Spring Boot auto-configure an embedded database and Spring Data JPA (with Hibernate as the JPA provider) along with entity scanning, you could compose your test configuration something like this:

@Configuration
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
@EntityScan(basePackageClasses = User.class)
@Import({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
public class TestRepositoryConfig {}

And then use that configuration in your test class like this:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestRepositoryConfig.class)
@Transactional
public class UserRepositoryTests { /* ... */ }

Regards,

Sam

p.s. You might find my answer to the following, related question useful as well: Disable security for unit tests with spring boot

like image 77
Sam Brannen Avatar answered Sep 22 '22 23:09

Sam Brannen