2017-02-06 1 views
1

私は春の起動アプリケーションがうまく動作しますが、統合テストで作業を開始したとき、プロジェクトに循環依存があることがわかりました:標準アプリケーション起動時に表示されない統合テストで例外を削除する

@Service 
public class CrowdManagerSyncService { 
    private final CrowdManagerSyncScheduler crowdManagerSyncScheduler; 

    @Autowired 
    public CrowdManagerSyncService(CrowdManagerSyncScheduler crowdManagerSyncScheduler) { 
     this.crowdManagerSyncScheduler = Objects.requireNonNull(crowdManagerSyncScheduler); 
    } 
} 

そして

@Component 
public class CrowdManagerSyncScheduler { 
    @Autowired 
    private CrowdManagerSyncService crowdManagerSyncService; 
} 

それは私のコードではありませんし、私は今、それを書き換えする準備ができていないです。しかし、それは生産において完璧に機能する。私の統合テスト

@RunWith(SpringRunner.class) 
@WebMvcTest(UserController.class) 
@WithMockUser(roles={"ADMIN"}) 
@ContextConfiguration(classes = {AdminConsoleApplication.class, DataSourceAutoConfiguration.class, 
     MockMvcAutoConfiguration.class, MockMvcWebDriverAutoConfiguration.class}) 
public class UserControllerTest { 
    @Autowired 
    private MockMvcHtmlUnitDriverBuilder builder; 
    private WebDriver webDriver; 

    @Before 
    public void setUp() throws Exception { 
     webDriver = builder.build(); 
    } 
} 

で、私は例外をキャッチ:

エラー名でBeanを作成する「crowdManagerSyncService」:要求された豆は、作成中です。解決できない循環参照はありますか?

ですから、私の質問は、このひどい循環依存性を取り除かずにこの問題をテストする際に、この問題を省略することです。本番環境でうまくいくので、コードを変更せずにテストコンテキストを開始する方法があることは確かです。

+0

スタックトレースを添付できますか?春のブートバージョン... – Babl

+0

@Bablここに私のスタックトレースです:http://pastebin.com/VYXh0vgh – Solorad

答えて

1

@WebMvcTestは、「適切な」統合テストには適していません。 the api docsから

:テストはのみ Spring MVCのコンポーネントに焦点を当てたときに

を使用することができます。

しかし、@ContextConfigurationを使用して、基本的にアプリケーション全体をテストに追加します。

@ContextConfigurationを削除して、@MockBeanCrowdManagerSyncServiceをテストに追加してください。 CrowdManagerSyncServiceのモックバージョンを作成し、それをテストアプリケーションコンテキストのUserControllerに挿入します。

@RunWith(SpringRunner.class) 
@WebMvcTest(UserController.class) 
@WithMockUser(roles={"ADMIN"}) 
public class UserControllerTest { 
    @Autowired 
    private MockMvcHtmlUnitDriverBuilder builder; 

    @MockBean 
    private CrowdManagerSyncService service; 

    private WebDriver webDriver; 

    @Before 
    public void setUp() throws Exception { 
     webDriver = builder.build(); 
    } 

    @Test 
    public void shouldWork() { 
     when(service.doStuff()) 
      .thenReturn("Hello"); // regular Mockito mocking 
    } 
} 

「本物」CrowdManagerSyncServiceどこかのないインスタンス化がありませんので、これはあなただけUserControllerをテストしようとしている場合には適切であり、循環依存の問題を回避し。あなたはまた、(MockMvcと実際のHTTPのものを置き換える)の両方(単に生産のようなアプリケーションをブートストラップ)@SpringBootTest@AutoConfigureMockMvc@WebMvcTest@ContextConfigurationを置き換えることができます

+0

ありがとう! '@SpringBootTest(classes = AdminConsoleApplication.class)'と '@ AutoConfigureMockMvc'が本当に助けてくれました! – Solorad

関連する問題