如何模拟在测试方法中创建的对象?

时间:2017-06-21 12:34:41

标签: java mocking mockito

我有ContextListener注入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);
    }
}

对于servletContext.setAttribute("db", joint);进行测试,我需要DBJoint joint才能发送setAttribute

我的测试:

@Test
public void whenThen() {

    final ServletContextEvent event = mock(ServletContextEvent.class);
    final ServletContext context = mock(ServletContext.class);
    when(event.getServletContext()).thenReturn(context);

    final ContextListener listener = new ContextListener();
    listener.contextInitialized(event);
    DBJoint joint = ..?// how to mocking this?
    verify(context).setAttribute("db", joint);
}
  1. 可能会对servletContext.setAttribute("db", joint);进行测试吗?
  2. 如果回答“是”,那该怎么做。
  3. 谢谢。

2 个答案:

答案 0 :(得分:1)

你可以使用power mock来模拟构造函数。试试这个

DBJointHandler joint = new DBJointHandler(" database_scripts"," authentication_database");         尝试{             PowerMockito.whenNew(DBJointHandler.class).withArguments(" database_scripts"," authentication_database")。thenReturn(joint);         } catch(例外e){             // TODO自动生成的catch块             e.printStackTrace();         }

答案 1 :(得分:1)

首先,您需要了解您的servletContext对象是一个模拟对象,而不是一个真实对象。 joint对象是真实的,您不需要模拟。 您可以使用mockito verify

测试servletContext.setAttribute("db", joint);
verify(servletContext).setAttribute(eq("db"), any(DBJoint.class));