저지 플러스 스프링을 종속성 주입 프레임 워크 (저지 스프링 브리지)로 사용하여 비슷한 상황이 발생했습니다. JerseyTest
프레임 워크로 통합 테스트를 작성하는 것은 테스트 전에 컨테이너를 시작하고 테스트 후에 컨테이너를 중지하기 때문에 까다로운 작업입니다. 이 접근법은 장점이 있지만, 봄이 매번 콩을 스캐닝하고 자동 와이어 링한다는 사실을 고려하면 시간이 많이 걸리고 까다로울 수 있습니다.
그리즐리 컨테이너를 한 번 초기화하고 테스트 클래스의 모든 테스트에 테스트를 사용하는 방법은 무엇입니까? 내가 JerseyTest
를 사용하지 않는
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class OrderResourceTest {
...
public static final String BASE_URI = "http://localhost:8989/";
private static HttpServer server = null;
...
...
}
공지 사항을 따르 인스턴스 변수로 테스트 클래스에서
로 HttpServer
의 인스턴스를 선언
내가 다음 단계를 따라 위를 달성하기 위해 테스트 컨테이너의 시작/멈춤을 직접 처리하기를 원하기 때문입니다. 이제 @Before
및 @AfterClass
을 사용하여 서버 인스턴스를 설정해야합니다. @Before
에서 설정하게됩니다 server
인스턴스를 같은 당신은 내가 @Before를 사용하고 있습니다에 대해 통지하는 경우는 (server
인스턴스로 같은 프로그램 로딩은 web.xml)에 web.xml
에
@Before
public void setUp() throws Exception {
if (server == null) {
System.out.println("Initializing an instance of Grizzly Container");
final ResourceConfig rc = new ResourceConfig(A.class, B.class);
WebappContext ctx = new WebappContext() {};
ctx.addContextInitParameter("contextConfigLocation", "classpath:applicationContext.xml");
ctx.addListener("com.package.something.AServletContextListener");
server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
ctx.deploy(server);
}
}
우리의 사용자 정의 필터/리스너 정의를로드하는 것이 하지만 if 조건은 @BeforeClass와 같은 기능을합니다. 정확히 내가 왜 @BeforeClass
을 사용하지 않았는지 기억하지 못한다. 나의 추측은 아마도 if 블록 내부의 설정 때문일 것이다. 어쨌든, 호기심이 있다면 시도하십시오.
- 테스트 할 예정 리소스로 ResourceConfig 작성이 포함 리소스/컨트롤러, ExceptionMapper있는 경우,로드해야 다른 클래스.
- WebappContext의 인스턴스를 만든 다음 예를 들어
applicationContext
과 같은 web.xml
컨텍스트 초기화 매개 변수를 프로그래밍 방식으로 추가합니다. 여기서 applicationContext
에는 스프링 기반 구성이 포함됩니다.
- web.xml에 리스너가있는 경우 위와 같이 프로그래밍 방식으로 추가해야합니다.
- 필터가 있거나 다른 프로그램이 있으면
ctx
에 프로그래밍 방식으로 추가해야합니다. 그리즐리 인스턴스
- 초기화
server
URI를 제공하고 ResourceConfig
- 의 인스턴스가 이미 프로그래밍 아무것도하지만, web.xml에없고 지금 사용 그것으로 서버 인스턴스를 전달하는 방법을 배포의
WebappContext
을 만들었습니다. 그러면 WebappContext
구성이 실행되어 server
인스턴스에 배포됩니다.
이제 web.xml과 인스턴스에 적용된 스프링 관련 구성을 사용하여 Grizzly 인스턴스를 실행하는 테스트를 마쳤습니다.
@AfterClass
public static void tearDown() throws Exception {
System.out.println("tearDown called ...");
if (server != null && server.isStarted()) {
System.out.println("Shutting down the initialized Grizzly instance");
server.shutdownNow();
}
}
에 따라로 볼 수
@AfterClass
사용하여 샘플 테스트 REST-보장 프레임 워크
@Test
public void testGetAllOrderrs() {
List<Orders> orders= (List<Orders>)
when().
get("/orders").
then().
statusCode(200).
extract().
response().body().as(List.class);
assertThat(orders.size()).isGreaterThan(0);
}
나는 REST-을 설정하기 때문에 위의 기본 경로를 지정하지 않고 작동하는 이유는 다음과 같이 기본 경로가 보장됩니다.
RestAssured.baseURI = "http://localhost:8989/";
REST 안심 후 사용하는
@Test
public void testGetAllOrders() {
Client client = ClientBuilder.newBuilder().newClient();
WebTarget target = client.target(BASE_URI);
Response response = target
.path("/orders")
.request(MediaType.APPLICATION_JSON)
.get();
assertThat(response.getStatus()).isEqualTo(200);
JSONArray result = new JSONArray(response.readEntity(String.class));
assertThat(result.length()).isGreaterThan(0);
}
저지 계 수입
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.servlet.WebappContext;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
에서 [TestNG의 지지체 (https://jersey.java.net/documentation/latest/test-framework.html#testng)에는 클래스 컨테이너가 있습니다. –
예. Junit4에는 BeforeClass 및 AfterClass 주석이 있습니다. 모든 테스트 방법을 마친 후 컨테이너를 시작/중지하는 것이 유용한 시나리오가 있는지 궁금합니다. –