79
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

SpringのRestTemplateが便利すぎて鼻血でた

元々はC#、最近はNode.jsがコーディングの主流だったのですが、仕事で久々にJavaを使うことになりました。Javaは10年以上前にJava AppletからJNIでPCの周辺機器を操作するようなものを作って以来です。ServletとかTomcatとかStrutsとかとは無縁に生きてきました。
というわけで、久々にJavaを使って見たら、Spring 3.0~ にRestTemplateとかいう余りに素敵なクラスがあって驚いて鼻血が出たので、驚きを記事にしてみました。

RestTemplate

RestTemplateの何がすごいかというと、Rest APIを呼び出すのに1行だけで済んでしまうという点です。これまでなら、HttpConnectionをOpenして、そこからBufferedWriterで書き出して、ResponseをBufferedReaderで読み込んで、みたいなことをしていましたが、そんな複雑なコードを全てスキップできます。ということでサンプルコードはこちら。

// packageは省略
import org.springframework.web.client.RestTemplate;

public class Main {
    public static void main(String[] args){
        RestTemplate restTemplate = new RestTemplate();
        User user = restTemplate.getForObject("https://server.to/api/user/12345", User.class);
    }
}

これだけで、https://server.to/api/user/12345にGETし、戻ってきたJSONデータをUser型にキャストしてuser変数に設定してくれます。
なんということでしょう!

MockRestServiceServer

RestTemplateのすばらしいところはコードがシンプルなだけでなく、テストもシンプルになるところです。RestTemplateを使った単体試験をするには、接続先のモックが必要となりますが、それもとっても簡単に作成できるのです。

@RunWith(MockitoJUnitRunner.class)
public class TestCase{
    @Test
    public void Test(){
        RestTemplate restTemplate = new RestTemplate();

        MockRestServiceServer mockServer = MockRestServiceServer.CreateServer(restTemplate);
        mockServer.expect(requestTo("https://server.to/api/user/12345"))
            .andRespond(withSuccess("{\"id\":\"12345\", \"Name\":\"Kawasaki Taro\", \"Age\":26}", MediaType.APPLICATION_JSON_UTF8));

        User user = restTemplate.getForObject("https://server.to/api/user/12345", User.class);

        assertThat(user.getId(), is("12345"));
        assertThat(user.getName(), is("Kawasaki Taro"));
    }
}

これでモックが動きます。
いやあ世の中便利になっていますねぇ。

参考:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
79
Help us understand the problem. What are the problem?