Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建ServletContext的mock属性?_Java_Unit Testing_Servlets_Mocking_Mockito - Fatal编程技术网

Java 如何创建ServletContext的mock属性?

Java 如何创建ServletContext的mock属性?,java,unit-testing,servlets,mocking,mockito,Java,Unit Testing,Servlets,Mocking,Mockito,我有一个Servlet,它在数据库中添加用户。Servlet使用模块的实例来处理数据库he的别名dbjoin。Servlet从ServletContext获取DBJoint的实例 @WebListener public class ContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContex

我有一个Servlet,它在数据库中添加用户。Servlet使用模块的实例来处理数据库he的别名
dbjoin
。Servlet从
ServletContext
获取
DBJoint
的实例

@WebListener
public class ContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        final ServletContext servletContext =
                servletContextEvent.getServletContext();

        final DBJoint joint = new DBJointHandler(
                "database_scripts",
                "authentication_database");

        servletContext.setAttribute("db", joint);
    }
}
在每个Servlet中,当我需要处理数据库时,我调用
ServletContext
并通过键
获取
DBJoint
“db”

我需要测试我的Servlet,并使用模拟对象代替原始对象:

在这个测试中,我尝试验证数据库脚本的执行器中doPost调用addUser(用户u)的主体。但是得到NPE

@Test
public void whenUserAddThenAddUserCall() throws ServletException, IOException, SQLException {

    final AddUserServlet servlet = new AddUserServlet();

    //mock http.
    HttpServletRequest request = mock(HttpServletRequest.class);
    HttpServletResponse response = mock(HttpServletResponse.class);

    User user = new User("name", "login", "password", "email");

    //mock database.
    ScriptExecutor executor = mock(ScriptExecutor.class);

    DBJoint joint = mock(DBJointHandler.class);
    when(joint.getDBScriptExecutor()).thenReturn(executor);


    final ServletContext context = request.getServletContext();
    //In this place I get NPE but why?
    context.setAttribute("db", joint);

    servlet.doPost(request, response);

    verify(executor).addUser(user);
}

为什么我有
NullPointerException
?如何测试这门课?谢谢大家!

您正在对模拟的
request
对象调用
request.getServletContext()

模拟对象不提供真正的方法实现。与实际的getServletContext()实现不同,该方法的存根版本被称为returning null

当对模拟调用方法时,应该告诉它需要返回什么,您需要像对DBJoinHandler模拟那样定义行为

要解决NPE,请执行以下操作:

when(request.getServletContext()).thenReturn(context);

其中,
context
可以是servlet上下文模拟。

您正在调用
request.getServletContext()
对象,该对象是模拟对象

模拟对象不提供真正的方法实现。与实际的getServletContext()实现不同,该方法的存根版本被称为returning null

当对模拟调用方法时,应该告诉它需要返回什么,您需要像对DBJoinHandler模拟那样定义行为

要解决NPE,请执行以下操作:

when(request.getServletContext()).thenReturn(context);

其中
context
可以是ServletContext模拟。

您还需要包括这些

ServletContext context = mock(ServletContext .class)
when(request.getServletContext()).thenReturn(context );

你也需要包括这些

ServletContext context = mock(ServletContext .class)
when(request.getServletContext()).thenReturn(context );

when(executor.addUserAndGetSuccess(user))。然后返回(true)
I get
IllegalStateCeption:ServletConfig尚未初始化
My AddUserServlet调用
getDatabaseExecutor()
,它失败了。我需要模拟ServletContext,因为将调用
getDatabaseExecutor()
。在
请求上调用getServletContext()方法时,需要为其定义行为。尝试以下操作:
when(request.getServletContext()).thenReturn(mock(ServletContext.class))
when(executor.addUserAndGetSuccess(user))。然后返回(true)
I get
IllegalStateCeption:ServletConfig尚未初始化
My AddUserServlet调用
getDatabaseExecutor()
,它失败了。我需要模拟ServletContext,因为将调用
getDatabaseExecutor()
。在
请求上调用getServletContext()方法时,需要为其定义行为。尝试以下操作:
when(request.getServletContext()).thenReturn(mock(ServletContext.class))