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
あなたの回答
tips
プレビュー