2015-11-24 38 views
4

我寫了下面JsonSerializerJackson連載整數數組到JSON:如何單元測試一個自定義的Jackson JsonSerializer?

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.SerializerProvider; 
import java.io.IOException; 

public class TalkIdsSerializer extends JsonSerializer<TalkIds> { 

    /** 
    * Serializes a TalkIds object into the following JSON string: 
    * Example: { "talk_ids" : [ 5931, 5930 ] } 
    */ 
    @Override 
    public void serialize(TalkIds talkIds, JsonGenerator jsonGenerator, 
     SerializerProvider provider) 
      throws IOException { 
     jsonGenerator.writeStartObject(); 
     jsonGenerator.writeArrayFieldStart(TalkIds.API_DICTIONARY_KEY); 
     for (Integer talkId : talkIds.getTalkIds()) { 
      jsonGenerator.writeNumber(talkId); 
     } 
     jsonGenerator.writeEndArray(); 
     jsonGenerator.writeEndObject(); 
    } 

} 

類用在這裏:

@JsonSerialize(using = TalkIdsSerializer.class) 
public class TalkIds { /* ... */ } 

我想測試串行的行爲,並想出瞭如下:

import com.fasterxml.jackson.core.JsonFactory; 
import com.fasterxml.jackson.core.JsonGenerator; 
import org.junit.Before; 
import org.junit.Test;  
import java.io.IOException; 
import java.io.StringWriter; 
import java.util.ArrayList; 
import java.util.Arrays; 
import static org.junit.Assert.assertNotNull; 
import static org.junit.Assert.assertTrue; 

public class TalkIdsSerializerTest { 

    protected final ArrayList<Integer> TALK_IDS = 
     new ArrayList<>(Arrays.asList(5931, 5930)); 

    protected TalkIdsSerializer talkIdsSerializer; 

    @Before 
    public void setup() throws IOException { 
     talkIdsSerializer = new TalkIdsSerializer(); 
    } 

    @Test 
    public void testSerialize() throws IOException { 
     StringWriter stringWriter = new StringWriter(); 
     JsonGenerator jsonGenerator = 
      new JsonFactory().createGenerator(stringWriter); 
     TalkIds talkIds = new TalkIds(); 
     talkIds.add(TALK_IDS); 
     talkIdsSerializer.serialize(talkIds, jsonGenerator, null); 
     String string = stringWriter.toString(); // string is "" 
     assertNotNull(string); 
     assertTrue(string.length() > 0); 
     stringWriter.close(); 
    } 

} 

但是,什麼都沒有寫入StringWriter。我究竟做錯了什麼?

回答

2

我也有類似的要求,測試自定義序列。我使用objectMapper直接獲取字符串(因爲您已經使用JsonSerialize註釋了TalkIds)。您可以從對象獲取的JSON字符串如下

String json = new ObjectMapper().writeValueAsString(talkIds) 
+0

這是單元測試JSON序列化最簡單的方法。謝謝。 – mvreijn

0

對我來說flush()什麼都沒有改變,所以我改變測試的方式,按照http://www.baeldung.com/jackson-custom-serialization

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.module.SimpleModule; 
import java.io.StringWriter; 

//... 

    @Test 
    public void serialize_custom() throws Exception { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule(); 
     module.addSerializer(MyCustomSerializer.class, myCustomSerializer); 
     objectMapper.registerModule(module); 
     StringWriter stringWriter = new StringWriter(); 

     TalkIds talkIds = new TalkIds(); 
     talkIds.add(TALK_IDS); 

     objectMapper.writeValue(stringWriter,wi); 
     assertTrue(stringWriter.toString().length() > 3); 
    } 
+0

隨意[結帳代碼](https://github.com/johnjohndoe/HalfnarpClient)。請注意,API目前處於離線狀態。我可能會嘲笑API響應,以便讓'testThatRealServerIsReachable()'再次通過。 – JJD

相關問題