我有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);
}
- 测试
servletContext.setAttribute("db", joint);
可能吗? - 如果回答"是",如何。
谢谢。
首先,您需要了解您的servletContext
对象是一个模拟对象,而不是一个真实的对象。joint
对象是真实的,你不需要嘲笑。您可以使用模拟验证来测试servletContext.setAttribute("db", joint);
verify(servletContext).setAttribute(eq("db"), any(DBJoint.class));
您可以使用幂模拟来模拟构造函数。试试这个
DBJointHandler joint=new DBJointHandler("database_scripts", "authentication_database"(; 尝试 { PowerMockito.whenNew(DBJointHandler.class(.withArguments("database_scripts", "authentication_database"(.thenReturn(joint(; } catch (Exception e( { 待办事项 自动生成的捕获块 e.printStackTrace((; }