2

grailsApplicationオブジェクトを介してサービス層 Bean にアクセスする (非 Grails アーティファクト) クラスがいくつかあります。ただし、この方法で実装されたクラスの単体テストに問題があります。Bean がメイン コンテキストに登録されないのはなぜですか?

@TestMixin(GrailsUnitTestMixin)
class ExampleTests {
  void setUp() {}

  void tearDown() {}

  void testSomething() {
    defineBeans {
      myService(MyService)
    }

    assert grailsApplication.mainContext.getBean("myService") != null
  }
}

上記のコードは次のエラーで失敗します。

org.springframework.beans.factory.NoSuchBeanDefinitionException: 「myService」という名前の Bean が定義されていません

私がやろうとしているのは、grailsApplication を介してプレーンな古い Java クラスからサービスにアクセスすることです。これは機能しますが、単体テスト環境では機能しません。別の方法で行う必要がありますか?

class POJO {
  MyService myService;

  public POJO(GrailsApplication grailsApplication) {
    myService = (MyService) grailsApplication.getMainContext().getBean("myService");
  }
}
4

3 に答える 3

9

答えはGrailsUnitTestMixin、Bean を保持する applicationContextparentContextで、grailsApplication

beans.registerBeans(applicationContext)

static void initGrailsApplication() {
...
//the setApplicationContext in DefaultGrailsApplication set's the parentContext
grailsApplication.applicationContext = applicationContext
}

したがって、次の方法で豆を取得できます。

defineBeans {
  myService(MyService)
}

assert applicationContext.getBean("myService")
assert grailsApplication.parentContext.getBean("myService")

編集

今日、私は同じ問題に直面しました。私の解決策は次のとおりです。

@Before
void setup() {
  Holders.grailsApplication.mainContext.registerMockBean("myService", new MyService())
}
于 2012-11-23T17:23:23.850 に答える