Q1: 按书中案例进行配置,当进行到单元测试(章节2.4.3)时,发现测试通过,但数据库中没有数据被写入,但能正确从数据库中获得数据。
A1:由于使用的是测试工具,因此对于数据库的任何写入修改都会被回滚,如果不需要回滚则要在测试类中加注释方法
@Rollback(value = false)
修改后测试类如下:
package com.smart.service;
import java.util.Date;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.testng.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import com.smart.domain.User;
import static org.testng.Assert.*;
@ContextConfiguration("classpath*:/spring-context.xml")
@Rollback(value = false)
public class UserServiceTest extends AbstractTransactionalTestNGSpringContextTests {
@Autowired
private UserService userService;
@Test
public void testHasMatchUser() {
boolean b1 = userService.hasMatchUser("wang", "123456");
boolean b2 = userService.hasMatchUser("admin", "1111");
assertTrue(b1);
assertTrue(!b2);
}
@Test
public void testFindUserByUserName()throws Exception{
for(int i =0; i< 100;i++) {
User user = userService.findUserByUserName("admin");
assertEquals(user.getUserName(), "admin");
}
}
@Test
public void testAddLoginLog() {
User user = userService.findUserByUserName("admin");
user.setUserId(1);
user.setUserName("admin");
user.setLastIp("192.168.12.7");
user.setLastVisit(new Date());
userService.loginSuccess(user);
}
}
Q2:按书中章节进行到2.6,通过jetty:run启动服务器后,访问地址 localhost:8000/bbs/index.html 时产生500错误,服务器日志报错 ERROR: Compilation error
A2:项目配置的JRE环境问题,MAVEN中将JRE设置为 Use Internal JRE 即可
Q3:整个过程中 Spring、spring-context.xml、各种注释方法(@Repository @Autowired)到底做了些什么?
A3:
1) @Repository、@Service、@Controller 和 @Component 与Bean之间的联系,参考
https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-iocannt/
我的理解 在UserServiceTest类中
@ContextConfiguration("classpath*:/spring-context.xml") public class UserServiceTest extends AbstractTransactionalTestNGSpringContextTests { @Autowired private UserService userService;
@Autowired标注的UserService类,则隐含了getter,setter方法,即等价于
private UserService userService; @Autowired public void setUserService(UserService userService){ this.userService = userService; }
具体实现将会从 classpath*:/spring-context.xml中查找,而classpath*:/spring-context.xml中可以看到
<context:component-scan base-package="com.smart.service"/>
也即将com.smart.service下所有类都会被扫描并定义为bean,如我仅有一个com.smart.service.UserService类,则等价于这段设置
<bean name="UserService" class="com.smart.service.UserService"/>
而 UserService注册的@Service 即表示自己会被扫描
@Service public class UserService {