質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

1587閲覧

@TestConfigurationが機能しない

sakura2685

総合スコア20

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

ユニットテスト

ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/07/13 04:08

編集2021/07/14 00:22

Java、SpringBootアプリケーションを作成しているのですが、コントローラーのテストで行き詰ってしまいました…

HomeControllerTest

1@WebMvcTest(HomeController.class) 2public class HomeControllerTest { 3 4 @Autowired 5 private MockMvc mockMvc; 6 7 @MockBean 8 private HomeService homeService; 9 10 @MockBean 11 private AccountService accountService; 12 13 @MockBean 14 private UserDetailsManager userDetailsManager; 15 16 @BeforeEach 17 public void setUp() { 18 19 } 20 21 @TestConfiguration 22 static class Config implements WebMvcConfigurer { 23 24 @Override 25 public void addFormatters(FormatterRegistry registry) { 26 27 } 28 } 29 30 @Test 31 public void testShowIndex() throws Exception { 32 33 mockMvc.perform(get("/manage")) 34 .andExpect(status().isOk()) 35 .andExpect(view().name("manage")) 36 .andReturn(); 37 38 }

テストを実行するとコントローラーではなく、DIしているサービスのBean重複エラーが出ました。
AccountServiceのBeanと、AccountServiceTestのBeanが重複しているとのエラーです。

error

1*************************** 2APPLICATION FAILED TO START 3*************************** 4 5Description: 6 7The bean 'accountService', defined in class path resource [net/dkt/dktsearch/service/AccountServiceTest$Config.class], could not be registered. A bean with that name has already been defined in file [C:\Users\nao\Documents\workspace-spring-tool-suite-4-4.6.2.RELEASE\dktsearch\target\classes\net\dkt\dktsearch\service\AccountService.class] and overriding is disabled. 8 9Action: 10 11Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true 12 132021-07-14 09:17:12.098 ERROR 11788 --- [ main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@34f5090e] to prepare test instance [net.dkt.dktsearch.controller.HomeControllerTest@5eefa415]

しかし、このAccountServiceTestですが、これ自体は問題なく動作しますし、該当のBeanも@TestConfigurationを設定しています。

AccountServiceTest

1@SpringJUnitConfig 2public class AccountServiceTest { 3 4 @TestConfiguration 5 static class Config { 6 7 @Bean 8 public AccountService accountService() { 9 10 return new AccountService(); 11 } 12 } 13 14 @Autowired 15 private AccountService accountService; 16 17 @MockBean 18 private JdbcTemplate jdbcTemplate; 19 20 @MockBean 21 private SpringUserService springUserService; 22 23 @MockBean 24 private AccountRepository accountRepository; 25 26 @MockBean 27 private TmpAccountRepository tmpAccountRepository; 28 29 @Test 30 public void testFind() { 31 32 Account account = new Account(); 33 34 when(accountRepository.findById("test")).thenReturn(Optional.of(account)); 35 36 Account a = accountService.find("test"); 37 verify(accountRepository).findById("test"); 38 } 39 40 @Test 41 public void testGetAccountsOfRoleClient() { 42 43 List<Account> accountList = new ArrayList<>(); 44 45 when(accountRepository.findByType("client")).thenReturn(accountList); 46 47 List<Account> aList = accountService.getAccountsOfRoleClient(); 48 verify(accountRepository).findByType("client"); 49 } 50 51}

@TestConfigurationを使用した場合はコンポーネントスキャン対象から外されるはずなのになぜBean重複エラーとなってしまうのでしょうか?

環境
Apache Maven 3.6.3
Java version: 1.8.0_241

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問