2017-11-01 7 views
1

@WebMvcTestアノテーションを使用してテストを作成していて、アプリケーションクラスに@ComponentScan注釈があると、テストの予想される動作が中断されることがわかりました。アプリケーションクラス内の@ComponentScanが@WebMvcTestと@SpringBootTestを中断する

WebMvcTestのjavadocによると:フル自動設定を無効にし、代わりに(MVCテストに関連する構成のみを適用します。この注釈を使用して

すなわち@Controller@ControllerAdvice@JsonComponent FilterWebMvcConfigurerHandlerMethodArgumentResolver豆ではなく@Component@Serviceまたは@Repository豆)。」

問題は@ComponentScanと、それはインストであるということです@Serviceと注釈を付けた抗豆。 @ComponentScanの代わりに@SpringBootApplicationアノテーションにスキャンベースパッケージを指定すると、すべてが期待通りに機能します。

@WebMvcTest注釈でコントローラクラスを指定すると、別の問題が発生します。アプリケーションクラスに@ComponentScanアノテーションがある場合、指定されたものだけをロードするのではなく、すべてのコントローラをロードします。

これはSpring Bootのバグですか?

excludeFiltersという属性が@SpringBootApplicationアノテーションで利用できないため、@ComponentScanを使用します。

解決方法私は、@Configurationアノテーションを持つ別のクラスを作成し、そこで@ComponentScanを移動することを発見しました。

答えて

2

この奇妙な動作の理由が見つかりました。あなたは@SpringBootApplication内部@ComponentScan注釈がexcludedFiltersが指定された属性がある見ることができるように

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Inherited 
@SpringBootConfiguration 
@EnableAutoConfiguration 
@ComponentScan(excludeFilters = { 
     @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), 
     @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) 
public @interface SpringBootApplication { 

これは@SpringBootApplication注釈の宣言です。

@ComponentScanアノテーションを自分のアプリケーションクラスに直接追加したとき、私はデフォルトのexcludedFiltersを指定しなかったため、動作が異なっていました。

+0

私は答えに同意しません。また、[進行中の議論](https://github.com/spring-projects/spring-boot/issues/10933#issuecomment-342131539)もあります。 –

+0

このページhttps://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/は「@ComponentScanを@SpringBootApplication経由で直接使用する場合は、TypeExcludeFilterを登録する必要があります。私は答えが正しいと信じています。 –

関連する問題