[SPRING] 메모리 내 단위 테스트 방법 Spring-Jersey
SPRING메모리 내 단위 테스트 방법 Spring-Jersey
저는 Spring-Jersey3와 함께 일하고 있으며 RESTFul API를 Spring beans로 단위 테스트하는 방법을 알 수 없습니다.
제어 장치
package com.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.service.DataSource;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("test")
@Component
public class SpringController {
@Autowired
private DataSource datasource;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getHello() {
return new String(datasource.load());
}
}
서비스 인터페이스
package com.service;
public interface DataSource {
public String load();
}
서비스 구현
package com.service;
import org.springframework.stereotype.Repository;
@Repository
public class DataSourceImpl implements DataSource {
@Override
public String load() {
return "Hello";
}
}
ResourceRegister.java (저지 리소스 레지스터)
package com.component;
import org.glassfish.jersey.server.ResourceConfig;
import com.controller.SpringController;
public class ResourceRegister extends ResourceConfig {
public ResourceRegister () {
register(SpringController.class);
}
}
을 포함한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.component.ResourceRegister</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
serviceContext.xml (응용 프로그램 컨텍스트)
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.service" />
<context:component-scan base-package="com.controller" />
</beans>
단위 테스트 << - 나는 이것을 실제로 테스트하는 방법이 없다.
public class test extends JerseyTest {
public test() {
super("com.service", "com.controller");
}
@Override
protected AppDescriptor configure() {
return new WebAppDescriptor.Builder("com.service","com.controller")
.contextParam("contextConfigLocation", "classpath:serviceContext.xml")
.contextPath("/rest")
.servletClass("org.glassfish.jersey.servlet.ServletContainer.class")
.initParam("javax.ws.rs.Application", "com.component.ResourceRegister")
.build();
}
@Test
public void test() {
Client client = new Client();
WebResource resource = client.resource("test");
ClientResponse response = resource.post(ClientResponse.class);
assertEquals(200, resposne.getStatus());
}
}
프로젝트 소스 코드
문제 : 의존성 주입이 null을 반환합니다.
해결법
-
==============================
1.내가 고칠 수있는 몇 가지 :
내가 고칠 수있는 몇 가지 :
다음은 작동하는 리펙터입니다.
종속성 (위의 코드 예처럼 GitHub 프로젝트에 테스트와 관련된 내용이 전혀 포함되어 있지 않으므로이 종속성을 추가하고 아무것도 수행하지 않았습니다)
<dependency> <groupId>org.glassfish.jersey.test-framework.providers</groupId> <artifactId>jersey-test-framework-provider-grizzly2</artifactId> <version>2.15</version> </dependency>
테스트
import com.component.ResourceRegister; import org.glassfish.jersey.servlet.ServletContainer; import org.glassfish.jersey.test.DeploymentContext; import org.glassfish.jersey.test.JerseyTest; import org.glassfish.jersey.test.ServletDeploymentContext; import org.glassfish.jersey.test.grizzly.GrizzlyWebTestContainerFactory; import org.glassfish.jersey.test.spi.TestContainerFactory; import org.junit.Assert; import org.junit.Test; import org.springframework.web.context.ContextLoaderListener; public class SpringTest extends JerseyTest { @Override protected TestContainerFactory getTestContainerFactory() { return new GrizzlyWebTestContainerFactory(); } @Override protected DeploymentContext configureDeployment(){ return ServletDeploymentContext .forServlet(new ServletContainer(new ResourceRegister())) .addListener(ContextLoaderListener.class) .contextParam("contextConfigLocation", "classpath:applicationContext.xml") .build(); } @Test public void test() { String response = target("test").request().get(String.class); Assert.assertEquals("Hello", response); System.out.println(response); } }
xml 컨텍스트 파일을 사용하지 않는 사용자는 주석 구성 응용 프로그램 컨텍스트를 사용하여 init 매개 변수로 추가 할 수 있습니다
return ServletDeploymentContext .forServlet(new ServletContainer(new ResourceRegister())) .addListener(ContextLoaderListener.class) .initParam("contextConfig", new AnnotationConfigApplicationContext(YourSpringConfig.class)) .build();
기타 참고 자료 :
그래서 몇 가지 더 테스트 한 후에, 내가 발견 한 몇 가지 흥미로운 것들이 있습니다.
위의 종속성으로 인해 DeploymentContext를 구성하지 않고 JerseyTest에서 Application configure ()를 재정의하더라도 여전히 작동합니다. 설명 할 수는 없지만 설명자가 여전히 선택되어있는 것처럼 보입니다.
import javax.ws.rs.core.Application; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.Assert; import org.junit.Test; public class SpringTest extends JerseyTest { @Override public Application configure() { return new ResourceConfig().packages("com.controller"); } @Test public void test() { String response = target("test").request().get(String.class); Assert.assertEquals("Hello", response); System.out.println(response); } }
위의 종속성 (회색 곰)을 제거하고 메모리 의존성을 사용하더라도 이전과 동일한 간단한 테스트가 작동합니다. 문서 상태
따라서이 테스트가 여전히 작동하므로 Servlet 기능에 대해 언급하지는 않습니다.
<dependency> <groupId>org.glassfish.jersey.test-framework.providers</groupId> <artifactId>jersey-test-framework-provider-inmemory</artifactId> <version>2.15</version> </dependency>
내가 특히 이해하지 못하는 것은이 진술이다.
테스트를 실행할 때 로그가 표시되기 때문에
from https://stackoverflow.com/questions/28614846/how-to-in-memory-unit-test-spring-jersey by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Javascript 긴 정수 (0) | 2018.12.08 |
---|---|
[SPRING] 최대 절전 모드 세션 및 트랜잭션 관리와 Spring을 통합하는 방법은 무엇입니까? (0) | 2018.12.08 |
[SPRING] Spring - ServletContextListener에 의존성 주입 (0) | 2018.12.08 |
[SPRING] @ResponseBody를 사용하여 Spring Controller에서 JSON 데이터를 반환하는 방법 (0) | 2018.12.08 |
[SPRING] 스프링 부트를 가져 와서 데이터베이스 스키마를 자동으로 만들 수 없습니다. (0) | 2018.12.08 |