テストのための@Configurationとして設定クラスに注釈を付ける必要がありますか?
-
21-12-2019 - |
質問
Spring Dataにorg.joda.time.DateTime->java.util.Date
コンバータが見つからないことに問題を解決しました(JODA-TIMEがクラスパスにある場合はデフォルトで有効にする必要があります)。私は理由を見つけましたが、それは春の@Configuration
注釈に関する質問を生み出しました。
Spring-Data-MongoDBからのAbstractMongoConfiguration
を使用した標準アプリケーション設定:
@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }
.
AppConfigクラスを明示的に使用するテスト(Spockではなく、Spring-Testによって提供される内部的なメカニズムが使用されています):
@ContextConfiguration(classes = AppConfig)
class JodaDocRepositorySpec extends Specification {
@Autowired
private JodaDocRepository jodaDocRepository
def "save document with DateTime"() {
given:
def jodaDoc = new JodaDoc(DateTime.now())
when:
def savedJodaDoc = jodaDocRepository.save(jodaDoc)
then:
savedJodaDoc.id
}
}
.
うまく機能します。しかしAppConfigの@Configuration注釈が削除された場合 /コメント:
//@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }
.
テストは次のとおりです。
org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type org.joda.time.DateTime to type java.util.Date
.
AFAIKコンテキスト内に(@Configuration
のClassesによって(@ContextConfiguration
のregister()
メソッド)、コンテキストクラスにAnnotationConfigWebApplicationContext
を使用する必要はありません。クラスはとにかく処理され、宣言されたすべてのBeanが見つかりました。異なるテストで使用されるテストコンテキストで同じパッケージ内に2類のコンフィギュレーションクラスがある場合、コンポーネントスキャンによる検出を防ぐために@Configuration
を使用しないことがある場合があります。
そのため、一般的な内部Beanの処理に応じて、コンテキスト内で異なる内部Bean処理を引き起こす可能性があると思います。私はこれら2つのケースからの春の丸太を比較し、いくつかの違いがありますが、私はSpring内部クラスで彼らが原因であるものを決定することはできません。バグの提出の前に私は尋ねたいです:
私の質問。は、同じ設定クラスのSpring(@Configuration
の指摘)がJoda-Timeのコンバータを使用する(またはNOT)、@ContextConfiguration
注釈の存在に応じて変換器を使用する(または)。
私は QuickStart Project 問題を再現します。 Spring-Data-MongoDB 1.3.3、Spring 4.0.0、Joda-Time 2.3。
解決
この動作ではすべて大丈夫です。AbstractMongoConfiguration
は@Configuration
によって注釈を付けられますが、実際、この注釈は@Inherited
ではないため、クラスに明示的に注釈を付ける必要があります。
@Configuration
アノテーションを削除すると、AppConfig
クラスは full 設定ではありません。@Bean
で注釈付きメソッドが含まれているため、 lite 設定としてプロセスです - org.springframework.context.annotation.ConfigurationClassUtils
-
isFullConfigurationCandidate()
-
isLiteConfigurationCandidate()
-
isFullConfigurationClass()
最後に full (@Configuration
によって注釈付き)設定クラスはプロセスクラスです.fencation postプロセッサによって拡張されています - ConfigurationClassPostProcessor.enhanceConfigurationClasses()