私は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
がテストの実行中にトリガーするのを防ぐにはどうすればよいですか?
リスナーは、テスト環境で使用する前にモックできます。 –