我有一個REST(球衣)服務公開,基本上委託調用DAO從數據庫中獲取一些數據並將其返回到JSON格式,如何單元測試web服務? 因爲我可以在junit中編寫jersey客戶端代碼,但是web服務委託給dao的數據獲取調用呢? Logic和DAO的後端代碼可以單獨測試,但Web服務又如何?所以請就最佳做法提供建議。junit REST web服務?
謝謝! Tarun
我有一個REST(球衣)服務公開,基本上委託調用DAO從數據庫中獲取一些數據並將其返回到JSON格式,如何單元測試web服務? 因爲我可以在junit中編寫jersey客戶端代碼,但是web服務委託給dao的數據獲取調用呢? Logic和DAO的後端代碼可以單獨測試,但Web服務又如何?所以請就最佳做法提供建議。junit REST web服務?
謝謝! Tarun
我想說的是,選擇部署一個特定的功能是你在最後一刻做出的。從服務確實的角度來看,客戶端是使用內存中調用,RMI,HTTP還是其他任何方式訪問它都沒有區別。
因此,我建議您從您的服務開始使用POJO界面。專注於它爲客戶做的事情。徹底測試實現,然後將其包裝在負責編組和解組數據的部署層中。如果你這樣做,你就像其他任何POJO課程一樣測試你的服務。
您可以使用模擬庫爲您的所有DAO類創建模擬對象。然後,您可以控制將什麼數據返回給您的服務。
[ JMock](http://www.jmock.org/)和[Mockito](http://code.google.com/p/mockito/)是我們想到的兩種流行的。 – hotshot309 2012-04-09 16:29:44
如果您可以提供夾具數據的DAO,然後您可以使用REST Assured輕鬆測試該服務。有關示例,請參閱頁面。
這將進行良好的組件測試,例如測試您的網絡服務和它將持久性存儲作爲「被測系統」附帶在一起。您需要將數據庫作爲依賴服務啓動。好處是您的測試還將涵蓋您在服務中定義的任何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, ...);
}
}
其實我的意思是如何停止web服務JUnit測試期間訪問DAO層因爲我不」想要訪問生產數據庫 – 2011-05-09 07:08:34