2016-06-27 14 views
0

私はuserのデフォルトテーブルをあらかじめ用意しておきます。サービスは次のようになります。SpringブートユニットのApplicationReadyEventビジネスロジックのテスト

@Service 
public class BootstrapService 
{ 
    @Autowired 
    UserRepository userRepository; 

    public void bootstrap() 
    { 
     User user = new User("admin", "password"); 
     userRepository.save(user); 
    } 
} 

私はApplicationListenerを使用して、アプリケーションの起動時にこのサービスを呼び出す:

@Component 
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> 
{ 
    @Autowired 
    private BootstrapService bootstrapService; 

    @Override 
    public void onApplicationEvent(final ApplicationReadyEvent event) 
    { 
     bootstrapService.bootstrap(); 
    } 
} 

今、私は、ユーザーが本当にいたかどうかを確認するBootstrapServiceのためのユニットテストを書きたいですこのように、コメントを追加しました:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MyApplication.class) 
@Transactional 
public class BootstrapServiceTests 
{ 
    @Autowired 
    private UserRepository userRepository; 

    @Autowired 
    private BootstrapService bootstrapService; 

    @Test 
    public void testBootstrap() 
    { 
     bootstrapService.bootstrap(); 

     assertEquals(1, userRepository.count()); 
    } 
} 

しかし何が起こるかbootstrapService.bootstrap()関数が二回呼び出されるということである - かつてでかつてはテスト自体によって2人のユーザがDBに追加されていました。

ApplicationListener#ApplicationReadyEventがテストの実行中にトリガーするのを防ぐにはどうすればよいですか?

+0

リスナーは、テスト環境で使用する前にモックできます。 –

答えて

1

コメントに記載されているように、リスナーを模擬しようとすることもできます(ただし、この正確なケースで動作するかどうかはわかりません)。

@Component 
@Profile("!test") 
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> 

その後、テストを実行すると、単に環境スイッチを使用します。私は考えることができる他の方法は、(これは確かに動作します)このように、テスト・プロファイルで実行されているからApplicationStartupを除外するために、春のプロファイルを使用することです。 --spring.profiles.active=test

欠点は、ApplicationStartupが「テスト」プロファイルを使用したすべてのテスト実行から除外されることです。

関連する問題