代码之家  ›  专栏  ›  技术社区  ›  Salem Masoud

字符串序列化单元测试失败

  •  0
  • Salem Masoud  · 技术社区  · 6 年前

    在运行JUnit测试之后 String 序列化失败,结果如下:

    预期: "netmodel"
    实际: "l"

    序列化方法如下

    public static void serializeString(String objectToSerialize, OutputStream outputStream) {
        byte[] bytesArr = objectToSerialize.getBytes();
        serializeInt(bytesArr.length, outputStream);
        try {
    
            outputStream.write(bytesArr);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    我的反序列化方法如下

    public static String deserializeString(InputStream inputStream) {
    String deserializeObject = "";
    char asciiToChar;
    int stringByteArrayLength = deserializeInt(inputStream);
    byte[] databytesArr = new byte[stringByteArrayLength];
    
    try {
      inputStream.read(databytesArr, 0, stringByteArrayLength);
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    
    for (int i = 0; i < databytesArr.length; i++) {
      asciiToChar = (char) databytesArr[i];
      deserializeObject = "" + Character.toString(asciiToChar);
    }
    return deserializeObject;
    } 
    

    最后,我编写了一个单元测试,如下所示

    public class StringSerializerTest {
    
      private InputStream iStream;
      private ByteArrayOutputStream oStream;
    
      @Before
      public void init() {
        oStream = new ByteArrayOutputStream();
      }
    
      String serialzeAndDeserializeObject(String stringValue) {
        OutputStreamUtil.serializeString(stringValue, oStream);
        iStream = new ByteArrayInputStream(oStream.toByteArray());
        return InputStreamUtil.deserializeString(iStream);
      }
    
      @Test
      public void equals_equal() {
        String stringValue = "netmodel";
        String deserializedStringValue = serialzeAndDeserializeObject(stringValue);
        assertThat(deserializedStringValue).isEqualTo(stringValue);
      }
    }
    

    怎么了?如何修复?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Justin Albano    6 年前

    deserializeObject

    for (int i = 0; i < databytesArr.length; i++) {
        asciiToChar = (char) databytesArr[i];
        deserializeObject = "" + Character.toString(asciiToChar);
    }
    

    l

    for (int i = 0; i < databytesArr.length; i++) {
        asciiToChar = (char) databytesArr[i];
        deserializeObject += Character.toString(asciiToChar);
    }
    

    public static String deserializeString(InputStream inputStream) {
        String deserializeObject = "";
        char asciiToChar;
        int stringByteArrayLength = deserializeInt(inputStream);
        byte[] databytesArr = new byte[stringByteArrayLength];
    
        try {
            inputStream.read(databytesArr, 0, stringByteArrayLength);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    
        for (int i = 0; i < databytesArr.length; i++) {
            asciiToChar = (char) databytesArr[i];
            deserializeObject += Character.toString(asciiToChar);
        }
        return deserializeObject;
    } 
    
        2
  •  1
  •   Joop Eggen    6 年前

    DataOutputStream

    public static void serializeString(String objectToSerialize, OutputStream outputStream)
            throws IOException {
        byte[] bytesArr = objectToSerialize.getBytes(StandardCharsets.UTF_8);
        serializeInt(bytesArr.length, outputStream);
        outputStream.write(bytesArr);
    }
    
    public static String deserializeString(InputStream inputStream)
            throws IOException {
        int stringByteArrayLength = deserializeInt(inputStream);
        byte[] databytesArr = new byte[stringByteArrayLength];
        readFully(inputStream, databytesArr);
        return new String(databytesArr, StandardCharsets.UTF_8);
    }
    
    private static void readFully(InputStream inputStream, byte[] bytes) throws IOException {
        int i = 0;
        while (i < bytes.length) {
            int nread = inputStream.read(bytes, i, bytes.length - i);
            if (nread <= 0) {
                throw new IOException("Premature EOF");
            }
            i += nread;
        }
    }