2016-02-09 50 views
1

我使用Jackson JSON提供程序來序列化/反序列化JAXRS請求。如何測試jackson-jaxrs-json提供程序(Arquillian + Wildfly)

爲了將其設置我有一個jboss-deployment-structure.xml下的文件夾WEB-INF

<jboss-deployment-structure> 
    <deployment> 
     <exclusions> 
      <module name="org.jboss.resteasy.resteasy-jackson-provider"/> 
      <module name="org.jboss.resteasy.resteasy-jettison-provider"/> 
     </exclusions> 
     <dependencies> 
      <module name="org.jboss.resteasy.resteasy-jackson2-provider" services="import"/> 
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

所以,我已經建立了一個測試,以得到它:

@RunWith(Arquillian.class) 
public class FollowUpActivityDTOSerializationTest 
{ 

    @Inject private ObjectMapper mapper; 

    @Deployment 
    public static WebArchive createDeployment() 
    { 
     System.getProperties().remove("javax.xml.parsers.SAXParserFactory"); 
     EmbeddedGradleImporter importer = ShrinkWrap.create(EmbeddedGradleImporter.class); 
     WebArchive war = importer.forThisProjectDirectory().importBuildOutput().as(WebArchive.class); 

     war.addClass(ArquillianAlternative.class); 
     war.addClass(MockFactory.class); 
     war.addAsWebInfResource(
      new StringAsset("<alternatives><stereotype>com.living.mock.ArquillianAlternative</stereotype></alternatives>"), 
      "beans.xml" 
     ); 

     JavaArchive[] libs = Maven.resolver().resolve("org.mockito:mockito-core:2.0.31-beta").withTransitivity().as(JavaArchive.class); 
     war.addAsLibraries(libs); 

     return war; 
    } 

    @Test 
    public void emptyJSON() 
    { 
     String emptyJSON = "{\"id\": \"id\"}"; 

     try { 
      FollowUpActivityDTO dto = this.mapper.readValue(emptyJSON, FollowUpActivityDTO.class); 
      assertNotNull(dto); 
      assertEquals(dto.getId(), "id"); 
     } catch (IOException e) { 
      fail(e.getMessage()); 
     } 
    } 

} 

問題Weld告訴我:

具有限定符的ObjectMapper類型的不滿意的依賴關係@Default

問題,我怎樣才能得到傑克遜提供者?

+0

我不能告訴我們,如果傑克遜罐子實際上是在戰爭中,請添加輸出爲好。 – LightGuard

回答

0

默認情況下,沒有生產者ObjectMapper,除非您明確提供了一個。如果您用ObjectMapper的實例替換您的注入點,例如private ObjectMapper objectMapper = new ObjectMapper()你會避免注射問題。

0

這裏最重要的是獲得測試時間,JAX-RS實現將使用相同的ObjectMapper

,因爲我配置與此相關的在我的供應商的一些設置是非常重要的:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JacksonConfig implements ContextResolver<ObjectMapper> { 

    @Override 
    public ObjectMapper getContext(final Class<?> type) { 

     final ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 
     mapper.setSerializationInclusion(Include.NON_EMPTY); 

     return mapper; 
    } 

} 

所以,使用這種provider是很重要的。

因此,爲了注入這個對象,我寫這個注射代碼:

@Inject private ContextResolver<ObjectMapper> mapperResolver; 
相關問題