JUnit 测试 NullPointerException
JUnit test NullPointerException
我用Spring写WEB app,Hibernate,我有CRUD功能,我需要create test,worker的所有功能,但是测试不行。
这是我第一次使用 JUnit 进行测试,我无法 运行 测试成功,我有 NullPointerException
。我有 class 控制器 Handler.java
,型号 class Student.java
。
这是我的代码。
Student.java
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private int id;
@Column(name="lastName")
private String lastName;
@Column(name="firstName")
private String firstName;
@Column(name="middleName")
private String middleName;
@Column(name="groups")
private String group;
@Column(name="rating")
private double average;
//setter and getter, constructor
Handler.java - 这是控制器
@Controller
public class Handler {
@Autowired
private StudentDataAccessObject studentDAO;
public void setStudentDAO(StudentDataAccessObject studentDAO) {
this.studentDAO = studentDAO;
}
/**
* @param student data from the client
* @return return new data
* */
@RequestMapping(value="add", method=RequestMethod.POST)
@ResponseBody
public Student addStudent(@RequestBody Student student){
studentDAO.addStudentToDatabase(student);
return student;
}
...
}
StudentDataAccessObject.java
public class StudentDataAccessObject implements DatabaseStudent{
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
/**
* This method add student to database, use framework Hibernate
* @param student add to database
* */
public void addStudentToDatabase(Student student) {
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
session.save(student);
transaction.commit();
}
...
}
测试Handler.java这是测试class
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"Student-servlet.xml"})
public class TestDAO {
@Test
public void testHandler(){
Handler handler = new Handler();
Student student = new Student("Test1","Test2","Test3","Test4",4);
handler.addStudent(student);
}
...
}
学生-servlet.xml
<context:component-scan base-package="home.spring.mvc.controller"/>
<mvc:annotation-driven/>
<mvc:resources mapping="/views/**" location="/views/"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/student" />
<property name="username" value="********" />
<property name="password" value="********" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>home.data.model.student.Student</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.transaction.auto_close_session">true</prop>
</props>
</property>
</bean>
<bean id="studentDAO" class="home.data.db.dao.StudentDataAccessObject">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
您正在手动创建处理程序。 Spring 应该创建它。否则依赖注入将无法工作。如果没有依赖注入,您的 dao 将为空。您在这里有两个选择,要么让 spring 创建您的处理程序,要么您自己创建处理程序,但手动设置您的 dao。
这是修复空指针异常的手动创建示例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"Student-servlet.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
public class TestDAO {
@Autowired
private DatabaseStudent studentDAO;
@Test
public void testHandler(){
Assert.assertNotNull(studentDAO);
Handler handler = new Handler();
handler.setStudentDAO(studentDAO);
Student student = new Student("Test1","Test2","Test3","Test4",4);
handler.addStudent(student);
}
...
}
我用Spring写WEB app,Hibernate,我有CRUD功能,我需要create test,worker的所有功能,但是测试不行。
这是我第一次使用 JUnit 进行测试,我无法 运行 测试成功,我有 NullPointerException
。我有 class 控制器 Handler.java
,型号 class Student.java
。
这是我的代码。
Student.java
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private int id;
@Column(name="lastName")
private String lastName;
@Column(name="firstName")
private String firstName;
@Column(name="middleName")
private String middleName;
@Column(name="groups")
private String group;
@Column(name="rating")
private double average;
//setter and getter, constructor
Handler.java - 这是控制器
@Controller
public class Handler {
@Autowired
private StudentDataAccessObject studentDAO;
public void setStudentDAO(StudentDataAccessObject studentDAO) {
this.studentDAO = studentDAO;
}
/**
* @param student data from the client
* @return return new data
* */
@RequestMapping(value="add", method=RequestMethod.POST)
@ResponseBody
public Student addStudent(@RequestBody Student student){
studentDAO.addStudentToDatabase(student);
return student;
}
...
}
StudentDataAccessObject.java
public class StudentDataAccessObject implements DatabaseStudent{
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
/**
* This method add student to database, use framework Hibernate
* @param student add to database
* */
public void addStudentToDatabase(Student student) {
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
session.save(student);
transaction.commit();
}
...
}
测试Handler.java这是测试class
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"Student-servlet.xml"})
public class TestDAO {
@Test
public void testHandler(){
Handler handler = new Handler();
Student student = new Student("Test1","Test2","Test3","Test4",4);
handler.addStudent(student);
}
...
}
学生-servlet.xml
<context:component-scan base-package="home.spring.mvc.controller"/>
<mvc:annotation-driven/>
<mvc:resources mapping="/views/**" location="/views/"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/student" />
<property name="username" value="********" />
<property name="password" value="********" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>home.data.model.student.Student</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.transaction.auto_close_session">true</prop>
</props>
</property>
</bean>
<bean id="studentDAO" class="home.data.db.dao.StudentDataAccessObject">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
您正在手动创建处理程序。 Spring 应该创建它。否则依赖注入将无法工作。如果没有依赖注入,您的 dao 将为空。您在这里有两个选择,要么让 spring 创建您的处理程序,要么您自己创建处理程序,但手动设置您的 dao。
这是修复空指针异常的手动创建示例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"Student-servlet.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class})
public class TestDAO {
@Autowired
private DatabaseStudent studentDAO;
@Test
public void testHandler(){
Assert.assertNotNull(studentDAO);
Handler handler = new Handler();
handler.setStudentDAO(studentDAO);
Student student = new Student("Test1","Test2","Test3","Test4",4);
handler.addStudent(student);
}
...
}