在比較完整的專案中,一般都會至少要包含自動化的單元測試
不過 Application 還好,如果是 RESTful API 的話,應該要怎麼測試呢?
原先我自己的想法是使用 JUnit,然後可能是使用內嵌式的 Jetty
讓測試程式執行時,自動打開一台本地端的 Jetty、把專案佈署上去後開始執行測試。
但既有找到的方法(例如 [1]) 感覺整合性都不太高…。
最後想說,也許其實有更簡易的方式,於是變更了關鍵字之後,發現…真的有 XD。
Jersey 原來本身就有涵蓋了對應的測試架構了。
以下是以 Jersey 2 的範例建立最初級的 RESTful API,然後嘗試使用 Jersey 的 Test Framework 來對這個 API 做測試。
設定 Maven
pom.xml 裡面除了本來 Jersey 有的內容以外,還必須包含 Test Framework 的套件。
在這裡因為我喜歡用 Jetty,因此是拿 Jetty 的套件
如果比較喜歡像是 grizzly2、org.simpleframework.http、…等等的,可以在 [2] 的 26.2 章節中找到對應的 Maven 設定。
不過題外話,Jetty 的套件在文件 [2] 上寫的版本 2.23.1,其實在 Maven Repository Server 上找不到,因此我目前是用 2.23 版。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
< dependencyManagement > < dependencies > < dependency > < groupId >org.glassfish.jersey</ groupId > < artifactId >jersey-bom</ artifactId > < version >${jersey.version}</ version > < type >pom</ type > < scope >import</ scope > </ dependency > </ dependencies > </ dependencyManagement > < properties > < jersey.version >2.23</ jersey.version > </ properties > < dependencies > < dependency > < groupId >org.glassfish.jersey.containers</ groupId > < artifactId >jersey-container-grizzly2-http</ artifactId > </ dependency > <!-- Unit Test --> < dependency > < groupId >org.glassfish.jersey.test-framework.providers</ groupId > < artifactId >jersey-test-framework-provider-jetty</ artifactId > < scope >test</ scope > </ dependency > < dependency > < groupId >junit</ groupId > < artifactId >junit</ artifactId > < version >4.12</ version > < scope >test</ scope > </ dependency > </ dependencies > |
其中前 15 行是 Jersey 的範本自動產生的部份,也就是所有 Jersey 相關的套件全都自動套用 2.23 版。
主要要追加的部份是 23~27 行,jersey-test-framework-provider-jetty 這個套件。
撰寫 RESTful API
RESTful API 的部份,完全是 Jersey 範本自動產生的,內容如下:
1 2 3 4 5 6 7 8 |
@Path ( "myresource" ) public class MyResource { @GET @Produces (MediaType.TEXT_PLAIN) public String getIt() { return "Got it!" ; } } |
撰寫單元測試
單元測試的範例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import javax.ws.rs.core.Application; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.Assert; import org.junit.Test; public class MyTest extends JerseyTest { @Override protected Application configure() { return new ResourceConfig(MyResource. class ); } @Test public void test() { String hello = target( "myresource" ).request().get(String. class ); Assert.assertEquals( "Got it!" , hello); } } |
單元測試的部份,必須要繼承 org.glassfish.jersey.test.JerseyTest 這個類別,並且一定要覆寫 configure() 方法。
覆寫 confugire() 的目的,就是為了讓 JerseyTest 能夠知道需要被測試的 RESTful API 在哪裡
它才能夠正常地幫忙建立假的 endpoint。
而測試的時候,也必須使用 JerseyTest 內建提供的存取方法,而不是自己直接用像是 Appache HTTP Client 去存取 localhost。
最後要執行時,就用一般 JUnit 的方法執行即可。
相關資源
下篇:對 Jersey 製作的 RESTful API 做單元測試(二):啟用 Servlet
沒有留言:
張貼留言