3

Grails アプリケーションのサービス クラスに UnitSpec を使用してスポック テスト ケースを実行すると、grailsApplication が null として取得されます。

Error - Cannot get property 'config' on null object

grailsApplicationサービスクラスのスポックテスト中に設定する方法を教えてください。

私はたくさんグーグルで検索しましたが、私の問題は解決しませんでした。

これがコードです。

  def accountServiceMock = Mock(AccountService)
    def accountClientService = new AccountClientService()
def setup(){

    accountClientService.accountWS = accountServiceMock
    accountClientService.basicAuthInterceptor = authenticatorServiceMock        
}

def "test account by status() " (){
    setup:
    def mockAccountStatus = "ACTIVE"
    mockDomain(Account, [accountInstance])
    accountClientService.grailsApplication = grailsApplication

    when:
    accountClientService.getAccountByStatus(mockAccountStatus)  //calling web service by fetching url from default.properties file which is context

    then:
    Account.count() != 0

    where:
    accountInstance = new Account(10L, "ACTIVE","1234", "firstName", "LastName")
}

AccountService クラスの getAccountByStatus() メソッドで、url = grailsApplication.config.ACCOUNTWEBSERVICEURL を使用して webservice を呼び出します。これは default.properties ファイルにありますが、スポック テスト ケースを実行すると、次のようなエラーがスローされます。

null オブジェクトのプロパティ 'config' を取得できません

4

2 に答える 2

3

どうぞ:

import spock.lang.Specification
import grails.test.mixin.*

@TestFor(SomeService)
class SomeServiceIntegrationSpecSpec extends Specification {

    def "give me the config value"() {
        given: config.value = '123'
        expect: service.valueFromConfig == '123'
    }
}

...そして参考までに、 SomeService クラス:

class SomeService {

    def grailsApplication // autowired

    def getValueFromConfig() {
        grailsApplication.config.value
    }
}

上記の例は非常に単純ですが、どのように行うべきかを示すには十分です。@TestFor アノテーションのおかげで、grailsApplication のオートワイヤーが機能します。これがあなたのケースに合わない場合は、より多くの情報が必要になります:

  • グレイルズ版
  • Spock 版 (grails プラグイン版で十分)
  • NPEはどこから投げられますか?テストされたサービス自体またはモック
  • Grails の単体テストか統合テストか
  • 完全なテストソースは役に立ちます

あなたのケースが何であれ、あなたはいつでもここでj4yが答えたように設定をモックすることができます(現時点での最後の答え)

単体テストを行う場合は、Config.groovy が丸呑みされていないことに注意してください。言及する価値のあるもう 1 つのことは、Mock() または 'new' キーワードによって作成されたオブジェクトから NPE がスローされた場合、自動配線がないため驚くことではありません。

于 2013-03-18T15:08:49.347 に答える
1

同様の問題がありました。実際には、grailsApplication を参照するドメイン オブジェクトがありました。

テストからドメインに grailsApplication を割り当てることで修正されました。

@TestMixin(GrailsUnitTestMixin)
@TestFor(MyService)
@Mock([MyDomain])
class MyServiceSpec extends Specification {

    myTest() {

        grailsApplication.config.myValue = "XXX"

        def myDomain = MyDomain()

        myDomain.grailsApplication = grailsApplication

    }
}
于 2014-06-16T10:28:35.713 に答える