問題タブ [spring-test-mvc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
spring-mvc - thymeleaf を使用する安全なコントローラーを (TemplateProcessingException を取得せずに) 単体テストする方法は?
春のセキュリティと、テンプレート処理にタイムリーフを使用する単純なホーム (ルート) コントローラーを使用して、春のブートで単体テストを実行しようとしています。セキュリティ権限が正しく機能していること、および適切なデータがテンプレートから非表示または表示されていることを確認するために、いくつかの単体テストを作成しようとしています (これは thymeleaf スプリング セキュリティ統合を使用します)。アプリ自体は、実行すると正しく動作します。一連の統合テストで機能していることを確認したいだけです。ここですべてのコードを見つけることができますが、関連するスニペットも以下に含めます。
コントローラーは非常にシンプルで、テンプレートをレンダリングするだけです (ルート、つまり "/")。
テンプレートには多くの情報が含まれていますが、テストに関連するビットは次のとおりです。
そして最後にテスト:
上記のテストの両方で得られるエラーは次のとおりです。
testLoadRoot(ltistarter.controllers.AppControllersTest) 経過時間: 0.648 秒 <<< エラー! org.springframework.web.util.NestedServletException: リクエストの処理に失敗しました。ネストされた例外は org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.extras.springsecurity3.dialect.processor.AuthorizeAttrProcessor' (home:33) at org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext (WebApplicationContextUtils.java:84) org.thymeleaf.extras.springsecurity3.auth.AuthUtils.getExpressionHandler(AuthUtils.java:260) で org.thymeleaf.extras.springsecurity3.auth.AuthUtils.authorizeUsingAccessExpression(AuthUtils.java:182) でorg.thymeleaf.extras.springsecurity3.dialect.processor.AuthorizeAttrProcessor.
ただし、両方のテストが有効で、springSecurityFilter が含まれている場合にのみ発生します。テストの 1 つを無効にして springSecurityFilter コード ( .addFilter(springSecurityFilter, "/*")
) を削除すると、そのエラーは発生しなくなります。何かが WebApplicationContext を台無しにしているか、セキュリティを何らかの障害状態のままにしている可能性があると思われますが、何をリセットまたは変更する必要があるかわかりません。
したがって、2 番目のテストを実行して springSecurityFilter を削除すると、最初のテストは失敗しますが (特にこれはassertTrue(content.contains("Form Login endpoint"))
)、エラーは発生しなくなります。生成された HTML を見ると、sec:authorize
属性を使用するタグのコンテンツがまったく表示されません。
だから私は周りを検索し、追加する必要があるという提案を見つけましたspringSecurityFilter
(上記のコードサンプルで実行しました)が、それを行うとすぐに失敗します(要点にさえ達しません)それなしでは失敗します)。その例外の原因とその修正方法に関する提案はありますか?
java - メタアノテーションから ContextHierarchy と ContextConfiguration をオーバーライドする
メタアノテーションを使用したテスト クラスがあります。
ただし、テストクラス自体から階層の要素をオーバーライドまたは追加できるようにしたいと考えています。たとえば、次のようになります。
これはこれまでのところうまくいきませんでした...これを実現するためのメカニズムはありますか? https://jira.spring.io/browse/SPR-11038を見つけましたが、この種の状況の完全な修正ではないと思います。
ありがとう!
spring - IntelliJ で Tiles 3 を使用した Spring MVC テストが機能しない
次の非常に単純なテストがあります。
Eclipse と Maven では問題なく実行されますが、IntelliJ では実行されません。tilesConfigurer が定義済みのビュー定義を見つけられないため、IntelliJ は Spring アプリケーション コンテキストの読み込みに失敗しました。
これはスタックトレースです:
問題を解決する方法はありますか?プロジェクトの特別な構成でしょうか?リソースローダーに問題があると思います...
java - スプリング テスト フレームワークを使用したサービスからの期待される結果のモック
Restful web service
を使用するためのテストケースを書きたいと思いSpring testing framework
ます。サービスをモックして、テストケースを正常に実行できました。
ただし、サービスが嘲笑されるため、空の応答が返されます。そのため、サービスからの期待される出力を設定したいと思います。
Mockito
またはのようなさまざまなモッキングフレームワークを使用してそれを実現できJmockit
ます(以下のコードではMockitoを使用しています)。
しかし、それwithout any addition/external testing frameworks
は internal とは別に可能ですかSpring testing framework
。
spring - カスタム UserDetails 実装を使用して Spring Security と MvcMock をテストする
この記事 [1] に従って、Spring MvcMock テストでセキュリティをモックしようとしています。
テストしたい REST サービスは次のようになります。
ここで、@ActiveUser
は のカスタム実装/拡張で@AuthenticationPrincipal
あり、AppUser
はカスタムUserDetails
実装です。
テストでは、これを行います:
私もいくつか追加しましたTestExecutionLIsteners
:
```
しかし、それは失敗します:
デフォルトのコンストラクターがないため、これで問題ありAppUser
ませんが、フレームワークは実際にユーザーを作成するのではなく、テストに渡したものを使用する必要があります。
実行時にこの問題を解決するには、Web 構成に を追加するAuthenticationPrincipalArgumentResolver
必要HandlerMethodArgumentResolver
がありましたが、テスト ケースでこれを行うにはどうすればよいですか?
これの実例はありますか?
[1] https://spring.io/blog/2014/05/23/preview-spring-security-test-web-security
編集:
テストクラスとその構成は次のようになります。
```
そして、これは完全なスタックトレースです:
```
```
spring - Spring Boot Java Config - Web (コントローラーなど) とサービスの分割
私の古い XML 構成プロジェクトでは、構成で次のことを行うことができました。
mvc-context.xml
service-context.xml
私のテストでは、次のことができます
そして、サービスと JPA リポジトリをロードせずに、MVC 構成に対してテストを実行し、代わりにモック@Autowired
をコントローラーに入れることができました。
ただし、Spring Boot アプリケーションには、メイン コンテキスト構成に次のものがあります。
これ@ComponentScan
は明らかにすべて、、@Controller
など@Service
を見つけます
MVC コンテキストをテストしようとすると、不要なサービスとリポジトリがロードされます。
私がやろうとしたことは、2つの新しい構成を作成することでした
Mvc.java
Services.java
ただし、これは機能しません。アプリを起動しようとすると、@Autowire
エラーが発生しますNo qualifying bean of type
私はこれについて間違った方法で進んでいますか?
JPA EntityManagers、Spring Data Repositories などをロードする時間のペナルティなしで、MVC コンテキストでテストを実行できるようにするにはどうすればよいですか?
spring-security - Spring Boot と MockMVC の統合テスト
MockMvc を使用して Spring Boot アプリケーションをテストする際に問題が発生しています。
次のテストクラスがあります。
これにより、401 ではなく HTTP 200 が返されます。コンポーネントのスキャンと自動構成が有効になっており、Spring セキュリティが SecuityConfiguration クラスで次のように構成されています。
RestTemplate を使用してアクセスするhttp://localhost:8080/accounts/1
と、期待される動作 (HTTP 401) が得られます。
メソッドを使用して手動でフィルターを自動配線し、追加することを示唆する他の例 (テスト用の Spring Boot セットアップ セキュリティなど) を見てきました。ただし、これは実際には失敗します ( )。FilterChainProxy
WebApplicationContext.addFilters(filterChainProxy)
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.web.FilterChainProxy] found
2 つの質問があります。
- 注入された WebApplicationContext が SpringSecurity フィルターを自動的に使用しないのはなぜですか? FilterChainProxy を取得して手動で追加できたとしても、EmbeddedWebApplicationContext の JavaDoc には次のように記載されています。
コンテキストで定義された {@link Servlet} または {@link Filter} Bean は、組み込みサーブレット コンテナに自動的に登録されます。
その結果、セキュリティ フィルター チェーンを手動で追加する必要はないと思います。なぜなら、Spring Boot の自動構成マジックにより、これが「うまく機能する」と (間違って?) 期待しているからです。
- アプリケーションコンテキストに FilterChainProxy がないのはなぜですか? 繰り返しますが、AutoConfiguration に対する私の期待は間違っている可能性がありますが、これはコンテキスト構成の一部として構成されると思いました。
アドバイスをよろしくお願いします。
編集
FilterChainProxy が注入されない理由は、構成が次のように設定されているためです。
public void configure(WebSecurity web) { web.debug(true); }
これは実際にはorg.springframework.security.web.debug.DebugFilter
代わりに a を構成します。このデバッグ設定に関係なく、フィルターを取得する方法は次のとおりです。
これを MockMvcBuilder に次のように追加すると:
その後、期待どおりに動作します。
しかし、MockMVC がフィルターを無視する理由がわかりません。これは、テストの結果に影響を与える可能性のあるフィルターで何かが発生する可能性があるため、要求をテストするために重要であると思われるからです。さらに、適切にテストするには、サーブレット コンテキストですべてのフィルターを検索し、それらの優先度/URL マッピングを確立して適切に追加する必要があることを意味します。これはエラーが発生しやすく、不要なようです。