2017-04-02 363 views
0

我試圖從春季啓動應用程序中的服務執行Junit 4測試,並且我一直使用init獲取entityManagerFactory。春季啓動JUNIT測試服務測試失敗

我也想連接使用我的application.properties文件,但它想要使用嵌入式hsqldb進行連接。

有人能指出我正確的方向嗎?

下面是相關代碼:

APPLICATION.PROPERTIES:

# =============================== 
# = 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 

MAIN:

​​

ENTITY:

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; 

    } 

} 

DAO/REPOSITORY:

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<User, Long> { 
    public User findByEmail(String email); 
    public void setUserDao(UserDao userDao); 

} 

服務:

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<User> findAll(){ 
     return (List<User>) 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; 
    } 
} 

TEST:

/** 
* 
*/ 
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<User> users = new ArrayList<User>(); 
//  EasyMock.expect(userDao.findAll()).andReturn(users); 
//  EasyMock.replay(userDao); 
//  EasyMock.verify(userDao); 
//  Assert.notEmpty(users, "findAll() failed."); 
//  User user = new User(); 
//  user.setEmail("[email protected]"); 
//  user.setName("bogus"); 
//  UserService userService = new UserService(); 
//  this.setUserService(userService); 
     User user = this.userService.create("[email protected]", "bogus"); 
     final List<User> users = (List<User>) 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"); 
    } 

} 

應包括本:

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.s[email protected]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 : 

STACK:

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 

回答