2011-05-09 137 views
4

我有一個REST(球衣)服務公開,基本上委託調用DAO從數據庫中獲取一些數據並將其返回到JSON格式,如何單元測試web服務? 因爲我可以在junit中編寫jersey客戶端代碼,但是web服務委託給dao的數據獲取調用呢? Logic和DAO的後端代碼可以單獨測試,但Web服務又如何?所以請就最佳做法提供建議。junit REST web服務?

謝謝! Tarun

回答

0

我想說的是,選擇部署一個特定的功能是你在最後一刻做出的。從服務確實的角度來看,客戶端是使用內存中調用,RMI,HTTP還是其他任何方式訪問它都沒有區別。

因此,我建議您從您的服務開始使用POJO界面。專注於它爲客戶做的事情。徹底測試實現,然後將其包裝在負責編組和解組數據的部署層中。如果你這樣做,你就像其他任何POJO課程一樣測試你的服務。

+0

其實我的意思是如何停止web服務JUnit測試期間訪問DAO層因爲我不」想要訪問生產數據庫 – 2011-05-09 07:08:34

1

您可以使用模擬庫爲您的所有DAO類創建模擬對象。然後,您可以控制將什麼數據返回給您的服務。

+0

[ JMock](http://www.jmock.org/)和[Mockito](http://code.google.com/p/mockito/)是我們想到的兩種流行的。 – hotshot309 2012-04-09 16:29:44

3

如果您可以提供夾具數據的DAO,然後您可以使用REST Assured輕鬆測試該服務。有關示例,請參閱頁面。

0

這將進行良好的組件測試,例如測試您的網絡服務它將持久性存儲作爲「被測系統」附帶在一起。您需要將數據庫作爲依賴服務啓動。好處是您的測試還將涵蓋您在服務中定義的任何liquibase/flyway模式。我不知道你使用的是什麼數據庫,但有像h2這樣的內存數據庫,嵌入的Postgres數據庫,或者爲什麼不用你的特定持久存儲庫運行docker-image(你可以讓你的測試使用docker自動啓動docker容器-java)?

至於測試Web服務API本身,我會去普通的JUnit和http-matchers(https://github.com/valid4j/http-matchers)。

一個例子組件測試將結構是這樣的:

public class MyWebServiceTest { 
    private static final DatabaseRule DB = new MyDatabaseRule(); 
    private static final DropwizardAppRule<AppConfig> APP = new DropwizardAppRule<>(App.class, 
     resourceFilePath("config.yml"), config("db.url", DB.url())); 

    @ClassRule 
    public static final RuleChain RULE = RuleChain.outerRule(DB).around(APP); 

    private final Client client = ClientBuilder.newClient(); 

    @Test 
    public void exampleTest() { 
     Response r = client.target("http://localhost:"+APP.getLocalPort()+"/path").request().post(...); 

     assertThat(response, hasStatus(OK)); 
     assertThat(response, ...); 
    } 
}