:この記事では、最初の個人的なウェブサイトが登場春ブーツプロジェクトで使用スポックテストフレームワークを
スポックのフレームワークはテストフレームワークのGroovy言語に基づいており、GroovyとJavaが良い相互運用性を持っているので、枠組みの中で春ブートプロジェクトで使用することができ、エレガントで、効率的で、テストケースのDSLを書きます。スポック@RunWithと共に使用注釈JUnitフレームワークは、さらに、スポックとMockito(とすることができるブートアプリケーションをテスト--Mockitoスプリング併用します)。
このセクションでは、スポックを使用しますが、一緒にMockitoを(リポジトリのコントローラのテストとテストを含む)いくつかのテストケースを書き、スポックの次の経験を使用します。
リアル
- よると、春ブーツとアプリケーションの構築この資料に記載され、春ブーツ-のMavenプラグイン-このプラグインはまた、春のブートフレームワークでGroovyの言語をサポートしています。
- ポンポンファイルの枠組みの中でスポックを頼りに追加
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<scope>test</scope></dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<scope>test</scope>
</dependency>
- SRC / testディレクトリの下にグルーヴィーなフォルダを作成し、グルーヴィーフォルダにCOM /テスト/ bookpubパッケージを作成します。
- リソース・ディレクトリーに追加置くPackt-books.sql次のようにファイル:
INSERT INTO author (id, first_name, last_name) VALUES (5, 'Shrikrishna', 'Holla');
INSERT INTO book (isbn, title, author, publisher) VALUES ('978-1-78398-478-7', 'Orchestrating Docker', 5, 1);
INSERT INTO author (id, first_name, last_name) VALUES (6, 'du', 'qi');
INSERT INTO book (isbn, title, author, publisher) VALUES ('978-1-78528-415-1', 'Spring Boot Recipes', 6, 1);
- ではCOM /テスト/ bookpubディレクトリの作成SpockBookRepositorySpecification.groovyのファイルを、読み取ります。
package com.test.bookpubimport com.test.bookpub.domain.Author
import com.test.bookpub.domain.Book
import com.test.bookpub.domain.Publisher
import com.test.bookpub.repository.BookRepository
import com.test.bookpub.repository.PublisherRepository
import org.mockito.Mockito
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.SpringApplicationContextLoader
import org.springframework.context.ConfigurableApplicationContext
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator
import org.springframework.test.context.ContextConfiguration
import org.springframework.test.context.web.WebAppConfiguration
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.setup.MockMvcBuilders
import spock.lang.Sharedimport spock.lang.Specification
import javax.sql.DataSourceimport javax.transaction.Transactional
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebAppConfiguration
@ContextConfiguration(classes = [BookPubApplication.class,
TestMockBeansConfig.class],loader = SpringApplicationContextLoader.class)
class SpockBookRepositorySpecification extends Specification {
@Autowired
private ConfigurableApplicationContext context;
@Shared
boolean sharedSetupDone = false;
@Autowired
private DataSource ds;
@Autowired
private BookRepository bookRepository;
@Autowired
private PublisherRepository publisherRepository;
@Shared
private MockMvc mockMvc;
void setup() {
if (!sharedSetupDone) {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
sharedSetupDone = true;
}
ResourceDatabasePopulator populator = new
ResourceDatabasePopulator(context.getResource("classpath:/packt-books.sql"));
DatabasePopulatorUtils.execute(populator, ds);
}
@Transactional
def "Test RESTful GET"() {
when:
def result = mockMvc.perform(get("/books/${isbn}"));
then:
result.andExpect(status().isOk())
result.andExpect(content().string(containsString(title)));
where:
isbn | title
"978-1-78398-478-7"|"Orchestrating Docker"
"978-1-78528-415-1"|"Spring Boot Recipes"
}
@Transactional
def "Insert another book"() {
setup:
def existingBook = bookRepository.findBookByIsbn("978-1-78528-415-1")
def newBook = new Book("978-1-12345-678-9", "Some Future Book",
existingBook.getAuthor(), existingBook.getPublisher())
expect:
bookRepository.count() == 3
when:
def savedBook = bookRepository.save(newBook)
then:
bookRepository.count() == 4
savedBook.id > -1
}
}
- テストケースの実装、テストに合格
- モックオブジェクトを操作する方法スポックで次のテスト、前回の記事では、我々は持っているTestMockBeansConfig定義されたクラスPublisherRepositoryによるプレゼンス@Primaryに、以下に示すように、テストケースMockitoを実行するときに春のブート優先順位を生かし、春の豆をシミュレートされたフレームの例。
@Configuration
@UsedForTesting
public class TestMockBeansConfig {
@Bean
@Primary
public PublisherRepository createMockPublisherRepository() {
return Mockito.mock(PublisherRepository.class);
}
}
- 次のコードに示すように、getBooksByPublisher BookController.javaインタフェースを追加します。
@Autowired
public PublisherRepository publisherRepository;
@RequestMapping(value = "/publisher/{id}", method = RequestMethod.GET)
public List<Book> getBooksByPublisher(@PathVariable("id") Long id) {
Publisher publisher = publisherRepository.findOne(id);
Assert.notNull(publisher);
return publisher.getBooks();
}
- SpockBookRepositorySpecification.groovy、対応するテスト・ケース・ファイルを追加
def "Test RESTful GET books by publisher"() {
setup:
Publisher publisher = new Publisher("Strange Books")
publisher.setId(999)
Book book = new Book("978-1-98765-432-1",
"Mytery Book",
new Author("Jhon", "Done"),
publisher)
publisher.setBooks([book])
Mockito.when(publisherRepository.count()).
thenReturn(1L);
Mockito.when(publisherRepository.findOne(1L)).
thenReturn(publisher)
when:
def result = mockMvc.perform(get("/books/publisher/1"))
then:
result.andExpect(status().isOk())
result.andExpect(content().string(containsString("Strange Books")))
cleanup:
Mockito.reset(publisherRepository)
}
- 関係モデル、ブック依存-テストケースを実行し、テストコントローラが変換を実行する文字列ロードされたJSON HTTPレスポンスボディ、依存ジャクソンライブラリにオブジェクトを変換することにより、円形の依存関係の問題が存在してもよい見出すことができます出版社、出版社は、書籍の数、変換の実装では、そうでない場合は特別な処理が含まれている、それはサイクルの分解能になります。ここによって我々@JsonBackReferenceは、循環依存のコメントを防ぎます。
分析
図から分かるように、あなたはスポックの枠組みでエレガントかつ強力なテストコードを書くことができます。
まずSpockBookRepositorySpecification.groovyファイルを見て、クラスが仕様クラスから継承し、このクラスはJUnitのテストクラスを語っています。ビューの仕様クラスのソースコード、それは@RunWith(Sputnik.class)注釈の変更を見つけることができ、このコメントはスポックの間とJUnitの橋です。JUnitの案内に加えて、仕様クラスは、試験方法およびモック支持体の数を提供します。
注:スポックにこのドキュメントを参照してください:スポックフレームワークリファレンスドキュメント
「アートユニットテスト」は、テストユニットであって言及:テストデータを作成、試験方法を実行するために、3つの決意ステップの結果。その後、テスト・セットアップにより、これらの工程でスポック、期待、とき、などにラベルを付けます。
- セットアップ:このブロックは、変数、テストの準備データ等構築モックオブジェクトを定義するために使用されます。
- 期待:一般的に、テスト環境のセットアップブロックで作製したいくつかのassert文、チェックを含むブロックと、セットアップ後に使用
- とき:呼び出し元のメソッドは、このブロックでテストされます。
- その後:メソッドは期待に沿った実行結果かどうかを確認するためにテストするために、彼は主張することができたときに後の一般的な使用と、例外がように文をチェックして、文が含まれています。
- クリーンアップ:行うには、環境上のブロックをクリアするために使用される設定を変更し、現在の修正テストケースをロールバックしようとしている、我々はこのケースでpublisherRepositoryオブジェクトにリセット動作を行います。
スポックも(セットアップを提供)とクリーンアップ()メソッドは、すべてのテストケースと、このような私たちは、セットアップの方法を使用し、この例のようにクリーンアップアクションの使用のためにいくつかの準備:(1)httpリクエストを受け付けることができるウェブランタイム環境を模擬。 (2)ロード置くPackt-books.sqlファイル、インポート事前定義された試験データ。モックウェブ環境は一度だけなので、sharedSetupDoneを制御するには、このフラグを使用します。
この方法は、()メソッドは、トランザクションの動作を実行するために定義されているコメントは、関連したセットアップ()メソッドは、クリーンアップに変更された場合@Transactionalアノテーションは、トランザクションを操作することによって達成することができる。いずれかのすべてが成功するかにロールバック初期状態。私たちは、データベースがクリーンであることを保証するために、だけでなく、それぞれが同じデータを入力避けるために、この方法に依存しています。
春ブーツ1.xのシリーズ
- 春ブーツ自動設定、コマンドライン・ランナー
- 春ブーツの自動設定を理解します
- Redisの統合で@PropertySourceノートの春ブーツ
- 春のブートプロジェクトは、どのようにHTTPメッセージコンバータをカスタマイズします
- 春ブーツ統合のMongoDBを提供するために、RESTfulなインターフェース
- スコープ内のSpring Bean
- 春ブートイベントディスパッチャは、プロジェクトモードで使用しました
- 春ブーツはRESTfulなインターフェースを提供しエラー処理の実践
- 戦闘の春ブーツは、彼らのスターターをカスタマイズ
- どのように春のブートプロジェクトは、HTTPとHTTPSの両方のプロトコルをサポートしています
- 春ブーツスターターは、自動的に注釈を設定するための設定をカスタマイズした方法
- 春ブーツは、プロジェクトMockitoで使用されます
バックエンド技術、JVMのトラブルシューティングと最適化、Javaのインタビューの質問、個人の成長と自己管理、および他のトピックの数にこのフォーカス、第一線の開発者は、読者のために働くと成長の経験、あなたはここで何かを得ることを期待することができます提供。