title: Spring boot JUNIT test fails for service test
body: <p>I am trying to perform a Junit 4 test from a service in a spring boot application and I keep getting an entityManagerFactory its with init.</p>
  
  <p>I also want connect using my application.properties file, but it wants to connect using the embedded hsqldb.</p>
  
  <p>Can someone point me in the right direction?</p>
  
  <p>Below is the pertinent code:</p>
  
  <p>APPLICATION.PROPERTIES:</p>
  
  <pre><code>    # ===============================
  # = DATA SOURCE
  # ===============================
  
  # Set here configurations for the database connection
  
  # Connection url for the database "netgloo_blog"
  spring.datasource.url = jdbc:mysql://localhost:3306/finra?useSSL=false
  
  # Username and password
  spring.datasource.username = finra
  spring.datasource.password = finra
  
  # Keep the connection alive if idle for a long time (needed in production)
  spring.datasource.testWhileIdle = true
  spring.datasource.validationQuery = SELECT 1
  
  # ===============================
  # = JPA / HIBERNATE
  # ===============================
  
  # Use spring.jpa.properties.* for Hibernate native properties (the prefix is
  # stripped before adding them to the entity manager).
  
  # Show or not log for each sql query
  spring.jpa.show-sql = true
  
  # Hibernate ddl auto (create, create-drop, update): with "update" the database
  # schema will be automatically updated accordingly to java entities found in
  # the project
  spring.jpa.hibernate.ddl-auto = update
  
  # Naming strategy
  spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
  
  # Allows Hibernate to generate SQL optimized for a particular DBMS
  spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
  </code></pre>
  
  <p>MAIN:</p>
  
  <pre><code>    package com.example;
  
  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;
  import org.springframework.boot.autoconfigure.domain.EntityScan;
  import org.springframework.context.annotation.ComponentScan;
  import org.springframework.transaction.annotation.EnableTransactionManagement;
  
  @SpringBootApplication
  @EnableTransactionManagement
  @ComponentScan(basePackages = {"com.example"})
  @EntityScan(basePackages = {"com.example.entity"})
  //@ImportResource("classpath:application.properties")
  //@Configuration
  //@EnableAutoConfiguration
  //@ComponentScan
  //@EnableScheduling
  public class DemoApplication {
  
      public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
      }
  }
  </code></pre>
  
  <p>ENTITY:</p>
  
  <pre><code>    package com.example.entity;
  
  import java.io.Serializable;
  
  public interface UserInterface extends Serializable{
      public long getId();
      public long setId(long value);
      public String getEMail();
      public void setEmail( String value );
      public String getName();
      public void setName(String value);
  }
  
      package com.example.entity;
  
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.Table;
  import javax.persistence.UniqueConstraint;
  //import javax.persistence.Table;
  import javax.validation.constraints.NotNull;
  
  @Entity
  //@Table(name = "users")
  @Table(
          uniqueConstraints = {
                  @UniqueConstraint(columnNames = {"email"})
          }
  )
  public class User implements UserInterface {
  
      /**
       * 
       */
      private static final long serialVersionUID = -507606192667894785L;
  
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private long id;
  
      @NotNull
      private String email;
  
      @NotNull
      private String name;
  
      @Override
      public long getId() {
          // TODO Auto-generated method stub
          return id;
      }
  
      @Override
      public long setId(long value) {
          // TODO Auto-generated method stub
          return id = value;
      }
  
      @Override
      public String getEMail() {
          // TODO Auto-generated method stub
          return email;
      }
  
      @Override
      public void setEmail(String value) {
          // TODO Auto-generated method stub
          email = value;
  
      }
  
      @Override
      public String getName() {
          // TODO Auto-generated method stub
          return name;
      }
  
      @Override
      public void setName(String value) {
          // TODO Auto-generated method stub
          name = value;
  
      }
  
  }
  </code></pre>
  
  <p>DAO/REPOSITORY:</p>
  
  <pre><code>    package com.example.dao;
  
  import javax.transaction.Transactional;
  
  import org.springframework.data.repository.CrudRepository;
  
  import com.example.entity.User;
  
  @Transactional
  public interface UserDao extends CrudRepository&lt;User, Long&gt; {
      public User findByEmail( String email );
      public void setUserDao(UserDao userDao);
  
  }
  </code></pre>
  
  <p>SERVICE:</p>
  
  <pre><code>    package com.example.service;
  
  import java.util.List;
  
  import org.apache.log4j.Logger;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Service;
  
  import com.example.dao.UserDao;
  import com.example.entity.User;
  
  @Service("userService")
  public class UserService {
      private final Logger log = Logger.getLogger (this.getClass());
  
      @Autowired UserDao userDao;
  
      public void setUserDao( UserDao userDao ){
          this.userDao = userDao;
      }
  
      public List&lt;User&gt; findAll(){
          return (List&lt;User&gt;) userDao.findAll();
      }
  
      public User findOne( long id ){
          return userDao.findOne(id);
      }
  
      public User getByEmail(String email) throws Exception{
  
          String userId = null;
          User user = null;
          try{
              user = userDao.findByEmail(email);
              userId = String.valueOf(user.getId());
          }catch(Exception e){
              log.error("User not found");
              e.printStackTrace();
              throw new Exception(e);
          }
          log.info("The user id is: " + userId);
          return user;        
      }
  
      public User create( String email, String name ){
          User user = null;
          try{
              user = new User();
              user.setEmail(email);
              user.setName(name);
              userDao.save(user);
          }catch( Exception e ){
              log.error("Error creating the user: " + e.getMessage());
          }
          log.info("User id: " + user.getId() + " saved.");
          return user;
      }
  
      public User updateUser(long id, String email, String name ){
          User user = null;
          try{
              user = userDao.findOne(id);
              user.setEmail(email);
              user.setName(name);
              userDao.save(user);
          }catch( Exception e ){
              log.error("Error updating the user: " + e.getMessage());
          }
          return user;
      }
  
      public User delete( long id ) throws Exception{
          User user = null;
  
          user = userDao.findOne(id);
          userDao.delete(user);
          return user;
      }
  }
  </code></pre>
  
  <p>TEST:</p>
  
  <pre><code>    /**
   * 
   */
  package com.example.service;
  
  import static org.junit.Assert.*;
  
  import java.util.List;
  
  import org.junit.Before;
  import org.junit.Test;
  import org.junit.runner.RunWith;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
  import org.springframework.boot.test.context.SpringBootTest;
  import org.springframework.util.Assert;
  import org.springframework.test.context.junit4.SpringRunner;
  import org.springframework.transaction.annotation.Transactional;
  
  import com.example.DemoApplication;
  import com.example.dao.UserDao;
  import com.example.entity.User;
  
  /**
   * @author denisputnam
   *
   */
  @RunWith(SpringRunner.class)
  @SpringBootTest(classes = DemoApplication.class)
  //@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
  //@SpringBootConfiguration
  @DataJpaTest
  @Transactional
  public class UserServiceTest {
  
      @Autowired
      private UserDao userDao;
  
      private UserService userService;
  
  //  @Autowired
  //  public void setUserService( UserService userService ){
  //      this.userService = userService;
  //  }
  
      /**
       * @throws java.lang.Exception
       */
      @Before
      public void setUp() throws Exception {
  
  
  //      userDao = EasyMock.createMock(UserDao.class);
  //
          userService = new UserService();
          userService.setUserDao(userDao);
  //      testEntityManager = new TestEntityManager(emf);
  //      this.testContextManager = new TestContextManager(getClass());
  //      this.testContextManager.prepareTestInstance(this);
      }
  
      /**
       * Test method for {@link com.example.service.UserService#findAll()}.
       */
      @Test
      public void testFindAll() {
  //      EasyMock.reset(userDao);
  //      final List&lt;User&gt; users = new ArrayList&lt;User&gt;();
  //      EasyMock.expect(userDao.findAll()).andReturn(users);
  //      EasyMock.replay(userDao);
  //      EasyMock.verify(userDao);
  //      Assert.notEmpty(users, "findAll() failed.");
  //      User user = new User();
  //      user.setEmail("bogus@bogus.com");
  //      user.setName("bogus");
  //      UserService userService = new UserService();
  //      this.setUserService(userService);
          User user = this.userService.create("bogus@bogus.com", "bogus");
          final List&lt;User&gt; users = (List&lt;User&gt;) this.userDao.findAll();
          Assert.notEmpty(users, "Found no users.");
  
      }
  
      /**
       * Test method for {@link com.example.service.UserService#findOne(long)}.
       */
      @Test
      public void testFindOne() {
          fail("Not yet implemented");
      }
  
      /**
       * Test method for {@link com.example.service.UserService#getByEmail(java.lang.String)}.
       */
      @Test
      public void testGetByEmail() {
          fail("Not yet implemented");
      }
  
      /**
       * Test method for {@link com.example.service.UserService#create(java.lang.String, java.lang.String)}.
       */
      @Test
      public void testCreate() {
          fail("Not yet implemented");
      }
  
      /**
       * Test method for {@link com.example.service.UserService#updateUser(long, java.lang.String, java.lang.String)}.
       */
      @Test
      public void testUpdateUser() {
          fail("Not yet implemented");
      }
  
      /**
       * Test method for {@link com.example.service.UserService#delete(long)}.
       */
      @Test
      public void testDelete() {
          fail("Not yet implemented");
      }
  
  }
  </code></pre>
  
  <p>SHOULD HAVE INCLUDED THIS:</p>
  
  <pre><code>    2017-04-02 16:30:00.627  INFO 93661 --- [           main] com.example.service.UserServiceTest      : Starting UserServiceTest on Deniss-IMAC.home with PID 93661 (started by denisputnam in /Users/denisputnam/git/springboot/demo)
  2017-04-02 16:30:00.627  INFO 93661 --- [           main] com.example.service.UserServiceTest      : No active profile set, falling back to default profiles: default
  2017-04-02 16:30:00.630  INFO 93661 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@3111631d: startup date [Sun Apr 02 16:30:00 EDT 2017]; root of context hierarchy
  2017-04-02 16:30:00.694  INFO 93661 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'userService' with a different definition: replacing [Generic bean: class [com.example.service.UserService]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [/Users/denisputnam/git/springboot/demo/target/classes/com/example/service/UserService.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=userServiceTest.Config; factoryMethodName=userService; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [com/example/service/UserServiceTest$Config.class]]
  2017-04-02 16:30:00.705  INFO 93661 --- [           main] beddedDataSourceBeanFactoryPostProcessor : Replacing 'dataSource' DataSource bean with embedded version
  2017-04-02 16:30:00.705  INFO 93661 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'dataSource' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Tomcat; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Tomcat.class]] with [Root bean: class [org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
  2017-04-02 16:30:00.705  WARN 93661 --- [           main] o.s.c.a.ConfigurationClassPostProcessor  : Cannot enhance @Configuration bean definition 'embeddedDataSourceBeanFactoryPostProcessor' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.
  2017-04-02 16:30:00.740  INFO 93661 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:hsqldb:mem:77b77b83-0034-41be-ab58-3f5d9490ea80', username='sa'
  2017-04-02 16:30:00.805  INFO 93661 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
  2017-04-02 16:30:00.805  INFO 93661 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
      name: default
      ...]
  2017-04-02 16:30:00.810  INFO 93661 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
  2017-04-02 16:30:00.825  INFO 93661 --- [           main] org.hibernate.tool.hbm2ddl.SchemaUpdate  : HHH000228: Running hbm2ddl schema update
  2017-04-02 16:30:00.827  INFO 93661 --- [           main] rmationExtractorJdbcDatabaseMetaDataImpl : HHH000262: Table not found: user
  2017-04-02 16:30:00.828  INFO 93661 --- [           main] rmationExtractorJdbcDatabaseMetaDataImpl : HHH000262: Table not found: user
  2017-04-02 16:30:00.829  WARN 93661 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
  2017-04-02 16:30:00.829  INFO 93661 --- [           main] utoConfigurationReportLoggingInitializer :
  </code></pre>
  
  <p>STACK:</p>
  
  <pre><code>    2017-04-02 16:05:44.625 ERROR 92739 --- [           main] o.s.boot.SpringApplication               : Application startup failed
  
  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
      at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
      at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120) [spring-boot-test-1.5.2.RELEASE.jar:1.5.2.RELEASE]
      at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12]
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12]
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12]
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12]
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12]
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit-4.12.jar:4.12]
      at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12]
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) [spring-test-4.3.7.RELEASE.jar:4.3.7.RELEASE]
      at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) [.cp/:na]
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:na]
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) [.cp/:na]
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) [.cp/:na]
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) [.cp/:na]
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) [.cp/:na]
  Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
  </code></pre>