java.lang.IllegalStateException: ServletConfig 尚未在测试中初始化
java.lang.IllegalStateException: ServletConfig has not been initialized in Tests
这是我的 Servlet。它得到一个字符串,我已将其放入我的监听器的 ServletContext 中。
@WebServlet(ADMIN_DISH_PATH)
public class AdminDishServlet extends HttpServlet {
private String uploadDir;
private DishService dishService;
@Override
public void init() throws ServletException {
dishService = ServiceManager.getInstance().getDishService();
ServletContext sc = getServletContext();
uploadDir = (String) sc.getAttribute(UPLOAD_DIR);
}
// doGet method
}
这是测试class
@ExtendWith(MockitoExtension.class)
public class AdminDishServletTest {
@Spy
AdminDishServlet adminDishServlet;
private static MockedStatic<ServiceManager> serviceManagerDummy;
@BeforeAll
static void setUp() {
serviceManagerDummy = Mockito.mockStatic(ServiceManager.class);
}
@AfterAll
static void close() {
serviceManagerDummy.close();
}
@Test
void whenGetReturnDishes() throws ServletException, IOException {
String uploadDir = "/testDir";
serviceManagerDummy.when(ServiceManager::getInstance).thenReturn(serviceManager);
when(serviceManager.getDishService()).thenReturn(dishService);
when(servletContext.getAttribute(UPLOAD_DIR)).thenReturn(uploadDir);
when(adminDishServlet.getServletContext()).thenReturn(servletContext); // Error happens here
adminDishServlet.init();
adminDishServlet.doGet(request, response);
// Some assertions
}
}
我有例外
java.lang.IllegalStateException: ServletConfig has not been initialized
at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:159)
发生异常的 GenericServlet(javax 包)中的代码
public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletContext();
}
但是如何将 ServletConfig 传递给通用 Servlet 或对其进行初始化?
创建一个 mock ServletConfig
,将它的 getServletContext()
方法模拟到 return 您的模拟 ServletContext
,然后使用另一个 init
方法:init(servletConfig)
.然后你不需要模拟你的servlet的getServletContext()
方法。
这是我的 Servlet。它得到一个字符串,我已将其放入我的监听器的 ServletContext 中。
@WebServlet(ADMIN_DISH_PATH)
public class AdminDishServlet extends HttpServlet {
private String uploadDir;
private DishService dishService;
@Override
public void init() throws ServletException {
dishService = ServiceManager.getInstance().getDishService();
ServletContext sc = getServletContext();
uploadDir = (String) sc.getAttribute(UPLOAD_DIR);
}
// doGet method
}
这是测试class
@ExtendWith(MockitoExtension.class)
public class AdminDishServletTest {
@Spy
AdminDishServlet adminDishServlet;
private static MockedStatic<ServiceManager> serviceManagerDummy;
@BeforeAll
static void setUp() {
serviceManagerDummy = Mockito.mockStatic(ServiceManager.class);
}
@AfterAll
static void close() {
serviceManagerDummy.close();
}
@Test
void whenGetReturnDishes() throws ServletException, IOException {
String uploadDir = "/testDir";
serviceManagerDummy.when(ServiceManager::getInstance).thenReturn(serviceManager);
when(serviceManager.getDishService()).thenReturn(dishService);
when(servletContext.getAttribute(UPLOAD_DIR)).thenReturn(uploadDir);
when(adminDishServlet.getServletContext()).thenReturn(servletContext); // Error happens here
adminDishServlet.init();
adminDishServlet.doGet(request, response);
// Some assertions
}
}
我有例外
java.lang.IllegalStateException: ServletConfig has not been initialized
at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:159)
发生异常的 GenericServlet(javax 包)中的代码
public ServletContext getServletContext() {
ServletConfig sc = getServletConfig();
if (sc == null) {
throw new IllegalStateException(
lStrings.getString("err.servlet_config_not_initialized"));
}
return sc.getServletContext();
}
但是如何将 ServletConfig 传递给通用 Servlet 或对其进行初始化?
创建一个 mock ServletConfig
,将它的 getServletContext()
方法模拟到 return 您的模拟 ServletContext
,然后使用另一个 init
方法:init(servletConfig)
.然后你不需要模拟你的servlet的getServletContext()
方法。