2

最初に言わなければならないのは、私は Grails よりも Spring のバックグラウンドを持っているということです。カードを持っていない場合、後の設定に関する規則は少し気がかりです。

grails プロジェクトを検討しています。

実際にはサービスではなく、別のオブジェクトの一部である「コンポーネント」(春のコンテキストにある POJO の春の用語) がある場合、どこに配置すればよいですか? src/groovy または grails/services で? 2 番目のオプションは、テストを作成するためのより多くの機能を提供するように見えます。Grails はサービスを次のように見なすためです。

Grails のサービスは、アプリケーションのロジックの大部分を配置する場所です

grails/services ディレクトリは、すべての Springified Bean の一種のバッグのように感じます...

次の質問は、そのサービスの Spring コンテキストでコンパニオン Bean が必要な場合、コンポーネント/サービスを単体テストするにはどうすればよいですか。このコンパニオンはサービスではなく、実行時に必須であるがデフォルトの実装を使用できる他のコンポーネントです。

spring では、この種の注釈を使用して、テスト用の小さなコンテキストを簡単に作成できます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/simple-job-launcher-context.xml", 
                                    "/jobs/skipSampleJob.xml" })

Grails で同じことを行うには? @ContextConfigurationアノテーションを使用してできるように、テスト用に再利用および構成できる小さな Spring コンテキストを作成するための推奨される方法があるかどうかを知りたいです。

Grails のすべての隠された慣習により、正しい方法 (存在する場合) を使用しないことを恐れていますが、それらについての明確な説明の湖は、Spring を直接使用するように私を駆り立てます。

4

2 に答える 2

1

src/groovy または src/java (実装言語によって異なります) に配置するのが一般的な方法であり、私の経験ではうまく機能します。

単体テストに関する限り、テストを行うために「コンパニオン Bean」が必要な場合、それは実際には単体テストではありません。オブジェクトを嘲笑するのはどうですか?grails で動作するモック/テスト ライブラリがいくつかあります。個人的には Spock がお気に入りです。

于 2012-10-29T21:29:01.240 に答える
0

私はRTFMを持っています、そして答えはそこにありました、ページの真ん中で少し溺死しました:http: //grails.org/doc/2.0.x/guide/testing.html

SpringBeansのテスト

TestForを使用する場合、実行中のGrailsアプリケーションで使用可能なSpringBeanのサブセットのみが使用可能です。追加のBeanを使用可能にしたい場合は、GrailsUnitTestMixinのdefineBeansメソッドを使用して行うことができます。

class SimpleController {
    SimpleService simpleService
    def hello() {
        render simpleService.sayHello()
    }
}
void testBeanWiring() {
    defineBeans {
        simpleService(SimpleService)
    }
controller.hello()
assert response.text == "Hello World"
}

コントローラは、実行中のGrailsアプリケーションと同じように、Springによって自動配線されます。コントローラの後続のインスタンスをインスタンス化した場合でも、自動配線が発生します。

void testAutowiringViaNew() {
    defineBeans {
        simpleService(SimpleService)
    }
def controller1 = new SimpleController()
    def controller2 = new SimpleController()
assert controller1.simpleService != null
    assert controller2.simpleService != null
}
于 2012-10-30T14:35:24.887 に答える