Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run JUnit unit tests in Spring Boot application without providing datasource

I am attempting to build a Spring Boot application, trying to stick to test driven development. My issue is that I have Spring Boot JPA included in my project but don't actually have a data source set up yet. Before adding the dependency, I was able to run my unit tests successfully.

Now that I have added the dependency, even attempting to execute my unit tests fails because it is unable to initialize a datasource for Spring Data.

I'm rather new to JUnit, Spring Boot and Mockito though. I want to be able to run my unit tests without actually having a datasource and instead mocking all of my repositories.

What is the proper way to do this?

like image 205
c.dunlap Avatar asked Jun 10 '16 20:06

c.dunlap


2 Answers

Step one. Add to pom.xml some kind of in-memory database. For example h2:

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>1.4.191</version>
  <scope>test</scope>
</dependency>

Then configure test datasource in your test application.properties located in (src/test/resources):

spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.H2Dialect

spring.datasource.platform=h2
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL;IGNORECASE=TRUE
spring.datasource.username=SA
spring.datasource.password=

This is just example for running h2 in-memory with mysql support mode. But you may use other modes (sql support) or even do not set this parameter at all.

like image 94
Konstantin Konyshev Avatar answered Nov 15 '22 09:11

Konstantin Konyshev


If you define some SQL engine commonly used for testing (e.g. HSQL, Derby or H2), Spring Boot should recognize it as test dependency and configure Datasource bean on top of it. In order to do that, just define such engine with test scope:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>test</scope>
</dependency>

Problem will arise when you introduce production Datasource (e.g. Postgres or MySQL). At that state you would need to

  • configure testing Datasource explicitly with @Primary annotation
  • or provide testing configuration file (e.g. src/test/resources/application.properties) where H2 will be configured.
like image 25
luboskrnac Avatar answered Nov 15 '22 09:11

luboskrnac