2016-07-22 2 views
4

프로젝트 중 하나에서 통합 테스트를 수정하려고합니다. 현재 모든 통합 테스트 클래스는 JerseyTest 클래스를 확장합니다. JerseyTest class을 살펴보면 Junit의 Before and After 주석을 사용하여 모든 테스트 메소드에 대한 컨테이너를 시작하고 중지한다는 것을 알게되었습니다.테스트 클래스의 모든 테스트에 대해 저지 테스트 컨테이너 (Grizzly)를 한 번 시작하는 방법은 무엇입니까?

왜 이것이 필요합니까? 컨테이너를 한 번 가져 와서 테스트를 실행 한 다음 컨테이너를 종료하면 충분하지 않습니까?

또한 Spring을 사용하며 컨텍스트가 초기화되는 데 시간이 걸립니다.

Junit4 이전에는 부울 플래그를 사용하여 수동으로 처리하여이 제한 사항을 해결했습니다.

@Before 
public void setup() { 
    if(!containerStarted) { 
    // start 
    containerStarted = true;  
    } 
// else do nothing 
} 
+0

에서 [TestNG의 지지체 (https://jersey.java.net/documentation/latest/test-framework.html#testng)에는 클래스 컨테이너가 있습니다. –

+0

예. Junit4에는 BeforeClass 및 AfterClass 주석이 있습니다. 모든 테스트 방법을 마친 후 컨테이너를 시작/중지하는 것이 유용한 시나리오가 있는지 궁금합니다. –

답변

2

@BeforeClass 및 @AfterClass를 사용하여 JerseyTest의 @Before 및 @After 라이프 사이클을 무시할 수 있습니다. 다음은 코드 템플릿입니다.

public abstract class MyJerseyTest { 
    private JerseyTest jerseyTest; 
    public MyJerseyTest(){ 

    } 

    @BeforeClass 
    public void setUp() throws Exception { 
    initJerseyTest() 
    jerseyTest.setUp(); 
    } 

    @AfterClass 
    public void tearDown() throws Exception { 
    jerseyTest.tearDown(); 
    } 

    private void initJerseyTest() { 
    jerseyTest = new JerseyTest() { 
     @Override 
     protected Application configure() { 
     // do somthing like 
     enable(...); 
     set(...); 

     // create ResourceConfig instance 
     ResourceConfig rc = new ResourceConfig(); 

     // do somthing like 
     rc.property(...); 
     rc.register(...); 

     return rc; 
     } 
    }; 
    } 
} 

희망이 있습니다.

2

저지 플러스 스프링을 종속성 주입 프레임 워크 (저지 스프링 브리지)로 사용하여 비슷한 상황이 발생했습니다. 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 블록 내부의 설정 때문일 것이다. 어쨌든, 호기심이 있다면 시도하십시오.

  1. 테스트 할 예정 리소스로 ResourceConfig 작성이 포함 리소스/컨트롤러, ExceptionMapper있는 경우,로드해야 다른 클래스.
  2. WebappContext의 인스턴스를 만든 다음 예를 들어 applicationContext과 같은 web.xml 컨텍스트 초기화 매개 변수를 프로그래밍 방식으로 추가합니다. 여기서 applicationContext에는 스프링 기반 구성이 포함됩니다.
  3. web.xml에 리스너가있는 경우 위와 같이 프로그래밍 방식으로 추가해야합니다.
  4. 필터가 있거나 다른 프로그램이 있으면 ctx에 프로그래밍 방식으로 추가해야합니다. 그리즐리 인스턴스
  5. 초기화 server URI를 제공하고 ResourceConfig
  6. 의 인스턴스가 이미 프로그래밍 아무것도하지만, 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; 
관련 문제