2016-07-09 8 views
3

文字列を入力ストリームにラップして、関数のベローをテストできるようにするにはどうすればよいですか?入力ストリームに文字列をラップする方法は?

(defn parse-body [body] 
    (cheshire/parse-stream (clojure.java.io/reader body) true)) 

(deftest test-parse-body 
    (testing "read body" 
     (let [body "{\"age\": 28}"] ;; must wrap string 
      (is (= (parse-body body) {:age 28})) 
      ))) 
+2

受け入れ答えは良いですし、あなたのタイトルの質問に答えるが、 'clojure.java.io/reader'は、任意の(文字ベースを受け入れることを知っています) 'java.io.Reader'であるため、(バイトベースの)' java.io.InputStream'や文字エンコーディングへの迂回は不要です。代わりに、単に文字列を['java.io.StringReader'](http://docs.oracle.com/javase/8/docs/api/java/io/StringReader.html)にラップしてください:'(java.io .StringReader。body) 'を実行します。 – glts

答えて

3

それが最初のバイト配列に変換することによって、ホスト・相互運用機能を使用して文字列から入力ストリームを構築することは簡単である:別のストリームとバイト相互運用例として

(defn string->stream 
    ([s] (string->stream s "UTF-8")) 
    ([s encoding] 
    (-> s 
     (.getBytes encoding) 
     (java.io.ByteArrayInputStream.)))) 

、ここで返す関数です与えられたフォーマットに文字列をエンコードする際に発生するバイトのベクトル:

(defn show-bytes 
    [s encoding] 
    (let [buf (java.io.ByteArrayOutputStream.) 
     stream (string->stream s encoding) 
     ;; worst case, 8 bytes per char? 
     data (byte-array (* (count s) 8)) 
     size (.read stream data 0 (count data))] 
    (.write buf data 0 size) 
    (.flush buf) 
    (apply vector-of :byte (.toByteArray buf)))) 

+user=> (string->stream "hello") 
#object[java.io.ByteArrayInputStream 0x39b43d60 "[email protected]"] 
+user=> (isa? (class *1) java.io.InputStream) 
true 
+user=> (show-bytes "hello" "UTF-8") 
[104 101 108 108 111] 
+user=> (show-bytes "hello" "UTF-32") 
[0 0 0 104 0 0 0 101 0 0 0 108 0 0 0 108 0 0 0 111] 
+0

魅力的な作品!ご協力いただき誠にありがとうございます。完璧な答え! – user983716

関連する問題