package com.test.service.impl;
import static org.junit.Assert.*;
import java.util.List;
import javax.annotation.Resource;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import com.test.config.AppConfig;
import com.test.domain.Department;
import com.test.domain.User;
import com.test.service.DepartmentService;
import com.test.service.UserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class,classes={AppConfig.class})
public class UserServiceImplTest {
@Resource(name="userServiceImpl")
private UserService userService;
@Resource(name="departmentServiceImpl")
private DepartmentService departmentService;
@Before
public void setUp(){
userService.updateByJpql("delete from User");
departmentService.updateByJpql("delete from Department");
}
@Test
public void testGetCount() {
//新建一个用户,并且设置这个用户是develop部门的.
User user=new User();
user.setUsername("username");
userService.persist(user);
assertEquals(1, (long)userService.getCount());
}
@Test
public void testSave() {
//新建一个develop部门
Department department=new Department();
department.setName("develop");
departmentService.persist(department);
//新建一个用户,并且设置这个用户是develop部门的.
User user=new User();
user.setUsername("username");
//通过id去查找develop部门出来
//(这个例子也表明:持久化到数据库后,表的主键值也和这个对象的字段进行了映射
//,即主键的自增值也这样拿到了,但得到这个值没有输出select语名,不明!)
Department develop=departmentService.findById(department.getId());
user.setDepartment(develop);
userService.persist(user);
}
@Test
public void testUpdate() {
Department department=new Department();
department.setName("develop");
departmentService.persist(department);
User user=new User();
user.setUsername("username");
Department develop=departmentService.findById(department.getId());
user.setDepartment(develop);
userService.persist(user);
//-----------以上是保存,以下是更新-----------------
//新增一个market部门
Department market=new Department();
market.setName("market");
departmentService.persist(market);
//找到这个用户
user=userService.findById(user.getId());
//找到market部门,并将这个用户的部门设为market部门
user.setDepartment(departmentService.findById(market.getId()));
//更新用户信息
userService.merge(user);
}
@Test
public void testRemove() {
//新建一个用户
User user=new User();
user.setUsername("username");
userService.persist(user);
userService.remove(user.getId());
assertEquals(0, userService.findAll().size());
}
@Test
public void testFindById() {
//新建一个用户
User user=new User();
user.setUsername("username");
userService.persist(user);
//通过id去查找出来
User userFinded=userService.findById(user.getId());
assertEquals(user.getId(), userFinded.getId());
}
@Test
public void testFindAll() {
//新建两个用户
User user=new User();
user.setUsername("username1");
userService.persist(user);
user=new User();
user.setUsername("username2");
userService.persist(user);
assertEquals(2, userService.findAll().size());
}
@Test
public void testFindByJpql() {
//新建两个用户
User user=new User();
user.setUsername("username1");
userService.persist(user);
user=new User();
user.setUsername("username2");
userService.persist(user);
//jpql很不好吧,这里的select u不要写u.*哦... 查询的是对象!!!必须要把所有字段都查出来.
//但可以使用createNativeQuery,这样就可以写本地的sql了.
assertEquals(1, userService.findByJpql("select u from User u where u.username=?", 0, 10,"username1").size());
}
@Test
public void testUpdateByJpql() {
//新建一个用户,并且设置这个用户是develop部门的.
User user=new User();
user.setUsername("username1");
userService.persist(user);
assertEquals(1, userService.updateByJpql("update User u set u.username=?","username2"));
}
@Test
public void testFindAllWithoutDepartment() {
//新建两个用户
User user=new User();
user.setUsername("username1");
Department department=new Department();
department.setName("department1");
departmentService.persist(department);
user.setDepartment(departmentService.findById(department.getId()));
userService.persist(user);
user=new User();
user.setUsername("username2");
userService.persist(user);
List<User> list=userService.findByJpql("select u from User u", 0, 10);
for (User u : list) {
System.out.println(u.getUsername());
//没有加载关联对象的信息,严禁使用关联对象的get方法,用了你就等着抛no session异常吧.也不要指望在这里加载关联对象的信息.
//请在服务层另起方法,使用@Transactional
/*
Department d=u.getDepartment();
if(d!=null){
System.out.println(d.getName());
}
*/
}
}
@Test
public void testFindAllWithDepartment() {
//新建两个用户
User user=new User();
user.setUsername("username1");
Department department=new Department();
department.setName("department1");
departmentService.persist(department);
user.setDepartment(departmentService.findById(department.getId()));
userService.persist(user);
user=new User();
user.setUsername("username2");
userService.persist(user);
//默认的懒加载是不能加载用户的部门信息,去get必然出错.就因为查一般用户信息和查用户部门信息是多个sql语句.
//所以有可能出现查一般用户信息,spring就关闭了session,而再没有开新的session.
//重新写了findAllWithDepartment方法就是为了查一般用户信息和查用户部门信息在同一个事务(session).
//所以就不会出现关闭session或session没初始化的异常了
List<User> list=userService.findAllWithDepartment();
for (User u : list) {
//System.out.println(u.getUsername());
Department d=u.getDepartment();
if(d!=null){
System.out.println(d.getName());
}
}
}
}