java - 没有实例化 Controller 类的模拟休息端点

标签 java spring rest integration-testing mockmvc

在制作 REST API 方面,我主要是 Spring Boot 用户,因此我并不总是对使用 xml 配置的经典 Spring 项目感到满意。

但是,我需要模拟一个休息端点来测试该特定项目。还有一些 DBUnit 可以模拟数据库值。 这是我正在使用的其余 Controller 的代码:

@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();
    }
}

这是我编写的测试类的(显然不起作用)代码:

@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 类。但是它没有构造函数(这不是我的代码)。 我认为我对依赖项在这种 Spring 应用程序中如何工作有一个理解问题。

在这种情况下正确使用 MockMvc 的解决方法是什么?

感谢您的帮助。

最佳答案

根据注释,似乎 MyRESTImpl 使用 JAX-RS 来实现端点(@Path@Context@GET) 而不是 Spring MVC。我不希望 this.mockMvc = MockMvcBuilders.standaloneSetup(myRESTImpl); 适用于非 Spring Web 端点,MockMvc 不会启动 servlet 容器。

我还可以看到一些错误:

java.lang.NoClassDefFoundError:org/springframework/web/servlet/DispatcherServletDispatcherServlet 不在类路径中,很可能是因为 spring-web 工件不是包含在 pom.xml 中的依赖项,并且是一种确认端点不是使用 Spring Web 实现的。

private static final Logger LOGGER = LogManager.getLogger(SalarieRESTImpl.class); 使用了错误的类。

从语义上讲,这似乎是一个端点实现,它也是一个 @Repository (或 Dao 实现),其中注入(inject) service 依赖项。这看起来很奇怪,您通常会将 Dao 注入(inject)到 Services 中,并将 Services 注入(inject)到 Controller 或 Endpoint 实现中。

关于java - 没有实例化 Controller 类的模拟休息端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44117590/

相关文章:

java - 如何在jsp页面中显示mysql数据库中的blob文件?

java - Android 4.0.3 上的 TCP 套接字

java - 如何将 Spring ObjectProvider 与多个 bean 定义一起使用

rest - Grails rest 插件 SSLexception 奇怪的域名比较 (domainname/ip-address)

java - 如何使用 Maven 运行并行 Cucumber Spring Boot 集成测试(surefire 或 failuresafe)?

java - Flamingo 功能区栏 - 以编程方式设置切换按钮

java - 如何使用表(Spring)上的选择在MyBatis(Spring)映射器中创建对象?

java - Spring 4 @Value 其中属性默认值是 java 系统属性

rest - 带有 DotNetOpenAuth 的 ASP.NET Web API

wcf - ExtendedProtectionPolicy.PolicyEnforcement 值不匹配。 IIS 的值为 WhenSupported,而 WCF 传输的值为 Never