【问题标题】:JUnit test NullPointerExceptionJUnit 测试 NullPointerException
【发布时间】:2015-08-06 12:26:34
【问题描述】:

我用 Spring、Hibernate 编写 WEB 应用程序,我有 CRUD 功能,我需要创建测试,工人的所有功能,但测试不起作用。

这是我第一次使用 JUnit 测试,我无法成功运行测试,我有 NullPointerException。我有类控制器Handler.java,模型类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();
    }
    ...
}

TestHandler.java这是测试类

@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);
    }
    ...
}

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>

【问题讨论】:

  • 添加异常堆栈跟踪,您可以删除所有不必要的代码。
  • DAO 不是单元测试的主题。这是集成测试的主题。
  • "我有 NullPointerException" 在哪个文件中?在哪条线上?您的堆栈跟踪将为您提供所有这些信息。
  • "我有 NullPointerException" 在行 handler.addStudent(student);

标签: java spring hibernate junit nullpointerexception


【解决方案1】:

您正在手动创建处理程序。 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);
    }
    ...
}

【讨论】:

  • 如何添加依赖项?您需要为该类添加一个处理程序吗?
  • @BohdanOlehovich 我刚刚添加了一个示例。我没有时间测试它,但这样的事情应该可以解决你的问题。
  • setStudentDAO 那个方法应该怎么做?如何实施?我在class handler中实现了这个setter字段,这个方法必须设置StudentDataAccessObject studentDAO?
  • 好吧,我忘了添加堆栈跟踪,这很糟糕,但你很快解决了问题,谢谢
  • 我不知道为什么这被否决了。我建议不要让 spring 参与单元测试。手动连接模拟。
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多