2013-03-20 2 views
1

В рамках теста Unit/Integration я пытаюсь использовать встроенный сервер RESTEasy TJWSEmbeddedJaxrsServer или POJOResourceFactory inorder, чтобы имитировать вызов MockHttpRequest.get("/data") ресурса для целей тестирования. Моя проблема заключается в том, что на основе использования сервера или фабрики ресурсов я не могу иметь ненулевой экземпляр весенних бобов, которые обычно вводятся в мои ресурсы.Inject Spring bean в RESTEasy Ресурс во время тестирования

Вот код для уточнения, спасибо заранее.

контекст Spring приложения:

<context:annotation-config /> 
<context:component-scan base-package="com.cdcfast.service" /> 
<bean id="simpleResource" class="com.cdcfast.rest.SimpleResource" /> 

SimpleResource.java:

@Component 
@Path("/data") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class SimpleResource { 

@Autowired 
private SimpleService service; 

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public List<Data> getData() { 
    return MockDataBase.getInstance().getRows(); 
} 

Test Unit:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath*:/test/spring/testApplicationContext.xml" }) 
public class FakeTest { 

private Dispatcher dispatcher; 

@Before 
public void before() { 
    dispatcher = MockDispatcherFactory.createDispatcher(); 
    POJOResourceFactory noDefaults = new POJOResourceFactory(SimpleResource.class); 
    dispatcher.getRegistry().addResourceFactory(noDefaults); 
} 

@Test 
public void aTestThatAlwaysPass() throws URISyntaxException { 
    MockHttpRequest request = MockHttpRequest.get("/data"); 
    MockHttpResponse response = new MockHttpResponse(); 
    dispatcher.invoke(request, response); 
    Assertions.assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_OK); 
    Assertions.assertThat(response.getContentAsString()).isNotNull().isNotEmpty(); 
} 

} 

ответ

2

У меня было это раньше, потому что заводы RESTEasy создают POJO, а не Spring, поэтому они не могут быть подключены к сети, которые можно обрабатывать в полном контейнере, но менее легки в тесте. Лучший способ обойти это, чтобы получить ручку на ваш POJO когда завод создает его, а затем сделать что-то похожее на это:

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(myPojo); 

лично я закончил тем, что весна создать бобы Resteasy с помощью Resteasy-Spring плагин и затем запуск моих тестов с помощью Jetty, не уверен, что это вариант для вас.

0

Я exeprienced такая же проблема и i'have решена аналогичным образом, как сделал Джеймс:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:spring-context-test.xml" }) 
public class TestMyService { 

    Dispatcher dispatcher; 
    private String username = "user"; 

    @Autowired 
    ApplicationContext context; 

    @Before 
    public void setUp() { 

    MyService g = new MyService(); //rest service with @autowired spring beans 
    context.getAutowireCapableBeanFactory().autowireBean(g); 
    dispatcher = MockDispatcherFactory.createDispatcher(); 
    dispatcher.getRegistry().addSingletonResource(g); 
    } 

    @Test 
    public void TestRest() { 
    MockHttpRequest request; 
    try { 
     request = MockHttpRequest.get("/rest/service").header("LOGON_USER", username); 
     MockHttpResponse response = new MockHttpResponse(); 

     dispatcher.invoke(request, response); 
     assertTrue("Error, unexpected status code: " + response.getStatus(), response.getStatus() == 200); 
     LoggerFactory.getLogger(this.getClass()).info("********** " + response.getContentAsString()); 
    } catch (URISyntaxException e) { 
     Log.error(e.getMessage(), e); 
     fail(e.getMessage()); 
    } 
    } 

} 
Смежные вопросы