没有实例化控制器的模拟休息端点 class
Mock rest endpoint without instantianting controller class
在制作 rest api 时,我主要是 Spring 引导用户,所以我并不总是对使用 xml 配置的 classic Spring 项目感到满意.
但是,我需要模拟一个休息端点来测试该特定项目。还有一些 DBUnit 来模拟数据库值。
这是我正在使用的其余控制器的代码:
@Path("/endpoint")
@Repository("myRestImpl")
public class MyRESTImpl implements MyREST {
private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class);
@Context
private MessageContext jaxrsContext;
@Resource
private WebServiceContext jaxwsContext;
@Value(value = "${base.url}")
private String baseUrl;
@Autowired
public SomeService someService;
@Autowired
private SomeOtherService someOtherService;
@Override
@GET
@Path("/test")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response getSalarieInfoByMatricule() {
LOGGER.info("Simple 404 test", matricule);
ResponseBuilder response = null;
esponse = Response.status(404);
return response.build();
}
}
这里是测试代码(显然不工作)class 我写了:
@ContextConfiguration(locations = { "classpath:/tu-dao-beans.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
DbUnitTestExecutionListener.class })
@DatabaseSetup(value = { "/db_data/dao/common.xml" })
@DbUnitConfiguration(dataSetLoader = ReplacementDataSetLoader.class)
public class MyMockMvcTest {
@Autowired
MyRESTImpl myRESTImpl;
@Autowired
private MappingJackson2HttpMessageConverter jacksonMessageConverter;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl)
.setMessageConverters(jacksonMessageConverter).build();
}
@Test
public void test() throws Exception {
mockMvc.perform(get("/endpoint/test")).andExpect(status().isNotFound());
}
}
当我 运行 执行此操作时,我得到如下所示的 Dispatcher servlet 异常:
java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet
at org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup(MockMvcBuilders.java:75)
at primobox.demat.webservices.rest.salarie.SalarieRESTImplIntMockMvcTest.setup(SalarieRESTImplIntMockMvcTest.java:36)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 10 more
我知道我应该实例化 myRESTImpl class。但是它没有构造函数(这不是我的代码)。
我想我对依赖项在那种 spring 应用程序中的工作方式有一个理解问题。
在这种情况下正确使用 MockMvc 的解决方法是什么?
感谢您的帮助。
根据注释,似乎 MyRESTImpl 使用 JAX-RS
来实现端点(@Path
、@Context
、@GET
)而不是 Spring MVC
.我不希望 this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl);
为非 Spring
网络端点工作,MockMvc
不会启动 servlet 容器。
我还能看到一些错误:
java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet
。 DispatcherServlet
不在 class 路径中,很可能是因为 spring-web
工件不是您的 pom.xml
中包含的依赖项,并且是一种确认端点未使用 Spring Web
.
private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class);
用错了class.
从语义上看,这似乎是一个端点实现,它也是一个 @Repository
(或 Dao
实现),其中注入了 service
依赖项。这看起来很奇怪,您通常会将 Dao 注入到服务中,并将服务注入到控制器或端点实现中。
在制作 rest api 时,我主要是 Spring 引导用户,所以我并不总是对使用 xml 配置的 classic Spring 项目感到满意.
但是,我需要模拟一个休息端点来测试该特定项目。还有一些 DBUnit 来模拟数据库值。 这是我正在使用的其余控制器的代码:
@Path("/endpoint")
@Repository("myRestImpl")
public class MyRESTImpl implements MyREST {
private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class);
@Context
private MessageContext jaxrsContext;
@Resource
private WebServiceContext jaxwsContext;
@Value(value = "${base.url}")
private String baseUrl;
@Autowired
public SomeService someService;
@Autowired
private SomeOtherService someOtherService;
@Override
@GET
@Path("/test")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response getSalarieInfoByMatricule() {
LOGGER.info("Simple 404 test", matricule);
ResponseBuilder response = null;
esponse = Response.status(404);
return response.build();
}
}
这里是测试代码(显然不工作)class 我写了:
@ContextConfiguration(locations = { "classpath:/tu-dao-beans.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
DbUnitTestExecutionListener.class })
@DatabaseSetup(value = { "/db_data/dao/common.xml" })
@DbUnitConfiguration(dataSetLoader = ReplacementDataSetLoader.class)
public class MyMockMvcTest {
@Autowired
MyRESTImpl myRESTImpl;
@Autowired
private MappingJackson2HttpMessageConverter jacksonMessageConverter;
private MockMvc mockMvc;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl)
.setMessageConverters(jacksonMessageConverter).build();
}
@Test
public void test() throws Exception {
mockMvc.perform(get("/endpoint/test")).andExpect(status().isNotFound());
}
}
当我 运行 执行此操作时,我得到如下所示的 Dispatcher servlet 异常:
java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet
at org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup(MockMvcBuilders.java:75)
at primobox.demat.webservices.rest.salarie.SalarieRESTImplIntMockMvcTest.setup(SalarieRESTImplIntMockMvcTest.java:36)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
Caused by: java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 10 more
我知道我应该实例化 myRESTImpl class。但是它没有构造函数(这不是我的代码)。 我想我对依赖项在那种 spring 应用程序中的工作方式有一个理解问题。
在这种情况下正确使用 MockMvc 的解决方法是什么?
感谢您的帮助。
根据注释,似乎 MyRESTImpl 使用 JAX-RS
来实现端点(@Path
、@Context
、@GET
)而不是 Spring MVC
.我不希望 this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl);
为非 Spring
网络端点工作,MockMvc
不会启动 servlet 容器。
我还能看到一些错误:
java.lang.NoClassDefFoundError: org/springframework/web/servlet/DispatcherServlet
。 DispatcherServlet
不在 class 路径中,很可能是因为 spring-web
工件不是您的 pom.xml
中包含的依赖项,并且是一种确认端点未使用 Spring Web
.
private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class);
用错了class.
从语义上看,这似乎是一个端点实现,它也是一个 @Repository
(或 Dao
实现),其中注入了 service
依赖项。这看起来很奇怪,您通常会将 Dao 注入到服务中,并将服务注入到控制器或端点实现中。