元々は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"));
}
}
これでモックが動きます。
いやあ世の中便利になっていますねぇ。
参考: