@Configuration class DynamoConfig { @Bean fun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient { ... } @Bean fun dynampoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient { ... } }
Now, for a test I wanted to override these 2 bean definitions and did something along these lines:
@SpringBootTest class DynamoConfigTest { @Test fun saveHotel() { val hotelRepo = DynamoHotelRepo(localDynamoExtension.asyncClient!!) val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip") val resp = hotelRepo.saveHotel(hotel) StepVerifier.create(resp) .expectNext(hotel) .expectComplete() .verify() } @TestConfiguration class SpringConfig { @Bean fun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient { ... } @Bean fun dynamoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient { ... } } }
This type of overriding works with Spring Boot 1.5.X but fails with Spring Boot 2.1.X with an error:
Invalid bean definition with name 'dynamoDbAsyncClient' defined in sample.dyn.repo.DynamoConfigTest$SpringConfig:.. There is already .. defined in class path resource [sample/dyn/config/DynamoConfig.class]] bound
I feel this behavior is right, not allowing beans to overridden this way is the correct default behavior for an application, however I do want the ability to override the beans for tests and thanks to a Stack Overflow answer and Spring Boot 2.1.X release notes, the fix is to allow overrides using a property "spring.main.allow-bean-definition-overriding=true", so with this change, the test looks like this:
@SpringBootTest(properties = ["spring.main.allow-bean-definition-overriding=true"]) class DynamoConfigTest { @Test fun saveHotel() { val hotelRepo = DynamoHotelRepo(localDynamoExtension.asyncClient!!) val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip") val resp = hotelRepo.saveHotel(hotel) StepVerifier.create(resp) .expectNext(hotel) .expectComplete() .verify() } @TestConfiguration class SpringConfig { @Bean fun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient { ... } @Bean fun dynamoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient { ... } } }
No comments:
Post a Comment