で残りのエンドポイントをテストしたいと思いますBookRestController
。で1つのテストを記述し@WebMvcTest
ます。
@RunWith(SpringRunner.class)
@WebMvcTest(BookRestController.class)
public class BookRestControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private CategoryService categoryService;
private ObjectMapper objectMapper = new ObjectMapper();
@Test
public void should_create_new_category_when_try_to_update() throws Exception {
given(categoryService.getCategoryById(20L)).willReturn(null);
Category category = new Category("Fantastyka");
ResultActions resultActions = mockMvc.perform(put("/api/category/10")
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(category)));
resultActions.andExpect(status().isNoContent());
}
}
リポジトリパッケージには4つのリポジトリがありますが、テストエンドポイントではそのうちの1つだけを使用しています。
そして、これは私の方法です BookRestController
@RestController
public class BookRestController {
@Autowired
private CategoryService categoryService;
@RequestMapping(value = "/api/category/{id}", method = RequestMethod.PUT)
public ResponseEntity<Category> updateCategory(@PathVariable Long id, @RequestBody Category category){
return ResponseEntity
.status(HttpStatus.NO_CONTENT)
.body(categoryService.updateCategory(id, category));
}
}
テストを実行するとエラーが発生する
発生原因:org.springframework.beans.factory.UnsatisfiedDependencyException:「demoApplication」という名前のBeanの作成エラー:コンストラクターパラメーター0で表現された、満たされていない依存関係。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:タイプ 'com.sda.spring.demo.repository.BookRepository'の適格なBeanがありません:autowire候補として適格な少なくとも1つのBeanが必要です 依存関係アノテーション:{}
どうして?BookRepository
テストでは使用しません。どうすれば修正できますか?
完全なログ:
java.lang.IllegalStateException:ApplicationContextのロードに失敗しました
main(JUnitStarter.java:70)原因:org.springframework.beans.factory.UnsatisfiedDependencyException:「demoApplication」という名前のBeanの作成中にエラーが発生しました:コンストラクターパラメーター0を介して満たされた依存関係が満たされていません。ネストされた例外はorg.springframework.beans.factory.NoSuchBeanDefinitionException:タイプ 'com.sda.spring.demo.repository.BookRepository'の適格なBeanがありません:オートワイヤ候補として適格な少なくとも1つのBeanが必要です 依存関係の注釈:{} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:767)at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218)at org。 springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)... 25原因:org.springframework.beans.factory.NoSuchBeanDefinitionタイプ「com.sda.spring.demo.repository.BookRepository」の適格なBeanが使用可能です:オートワイヤー候補として適格な少なくとも1つのBeanが必要です。依存関係アノテーション:{} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1646)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1205)at org。 springframework.beans.factory.support.DefaultListableBeanFactory。
Spring Boot:v2.1.0.RELEASE
編集:それは動作します。私は私の中で見逃して@Autowire
BookRepository
いDemoApplication
ます...私はこのコードを削除しましたが、今では機能します
@Autowired
private ApplicationContext applicationContext;
private BookRepository bookRepository;
private CategoryRepository categoryRepository;
@Autowired
public DemoApplication(BookRepository bookRepository, CategoryRepository categoryRepository) {
this.bookRepository = bookRepository;
this.categoryRepository = categoryRepository;
}
メインアプリケーションクラスは、定義済みのBean、またはアノテーションを介して有効にする機能をロードします。
例えば@EnableSchedling
、@ComponentScan
、@Import
など
すべてスライステストでロードされます。
詳細については、このドキュメントを参照してください。
賢明な方法でコードを構造化すると、@ SpringBootApplicationクラスがデフォルトでテストの構成として使用されます。
次に、アプリケーションのメインクラスに、その機能の特定の領域に固有の構成設定を散らかさないことが重要になります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加