2014-09-05 100 views
0

我想通过junit测试来测试我的服务层。除插入外,每件事都按预期工作。春季冬眠 - 无法测试插入

这是我的插入配置的测试用例:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"classpath:spring-servlet.xml"}) 
@TransactionConfiguration(transactionManager="transactionManager",defaultRollback=true) 
public class TestUserAccountDao { 
@Autowired 
UserAccountService userManager; 

UserAccount newUser; 

@Before 
public void init() { 
    newUser = new UserAccount(); 
    newUser.setUsername("TestUser"); 
    newUser.setEmail("[email protected]"); 
    newUser.setPassword("123456"); 
} 

@After 
public void tearDown() { 
    //userManager.remove(newUser); 
    newUser = null; 
} 

/** test: void add(UserAccount) 
* */ 
@Test //@Transactional 
public void testAdd() { 
    System.out.println(newUser); 
    userManager.add(newUser); 

    /*Session session = HibernateUtil.getSessionFactory().openSession(); 
    session.beginTransaction(); 
    session.save(newUser); 
    session.getTransaction().commit(); 
    session.close();*/ 
} 

我有,当我参与userManager.add(NEWUSER),该UserAccount犯规坚持到数据库的问题。但如果我改用纪念会议,它完美的作品。我不认为我的spring-servlet.xml有任何问题,因为我可以成功测试其他方法,并且我没有做任何关于add()的简单事情,只是简单地使用session.save(UserAccount)。

这是我得到的堆栈跟踪:

INFO | 2014-09-05 10:12:43,268 | TransactionalTestExecutionListener.java | 298 | Rolled back transaction after test execution for test context [[email protected] testClass = TestUserAccountDao, testInstance = [email protected], testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected] testClass = TestUserAccountDao, locations = '{classpath:spring-servlet.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]] 
INFO | 2014-09-05 10:12:43,271 | TransactionalTestExecutionListener.java | 276 | Began transaction (2) for test context [[email protected] testClass = TestUserAccountDao, testInstance = [email protected], testMethod = [email protected], testException = [null], mergedContextConfiguration = [[email protected] testClass = TestUserAccountDao, locations = '{classpath:spring-servlet.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]]; transaction manager [[email protected]8598a4f]; rollback [true] 

回答

0

的交易通常是由(在你的情况与春季@Transactional注释上的服务方法)服务层管理。所以当你测试它时,你不需要玩交易(你不必打开和关闭它)。

如果你想单元测试你的服务层,你将不得不用Mockito来模拟你的DAO(persistence layer)。