diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/test/TestChannelBinderConfiguration.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/test/TestChannelBinderConfiguration.java index a308b0cc5..b4feed23f 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/test/TestChannelBinderConfiguration.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/test/TestChannelBinderConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019 the original author or authors. + * Copyright 2017-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.binder.Binder; import org.springframework.cloud.stream.binder.ConsumerProperties; @@ -41,6 +42,7 @@ import org.springframework.integration.config.EnableIntegration; * * @param binding type * @author Oleg Zhurakousky + * @author David Turanski * @see TestChannelBinder */ @Configuration @@ -78,6 +80,17 @@ public class TestChannelBinderConfiguration { return configClasses.toArray(new Class[] {}); } + /** + * Create an {@link ApplicationContextRunner} with user configuration using {@link #getCompleteConfiguration}. + * @param additionalConfigurationClasses config classes to be added to the default + * config + * @return the ApplicationContextRunner + */ + public static ApplicationContextRunner applicationContextRunner(Class... additionalConfigurationClasses) { + return new ApplicationContextRunner() + .withUserConfiguration(getCompleteConfiguration(additionalConfigurationClasses)); + } + @Bean public InputDestination sourceDestination() { return new InputDestination(); diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/DynamicDestinationFunctionTests.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/DynamicDestinationFunctionTests.java index f59715e50..01cbded38 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/DynamicDestinationFunctionTests.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/DynamicDestinationFunctionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019-2019 the original author or authors. + * Copyright 2019-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,16 +22,13 @@ import org.junit.After; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.stream.binder.PartitionKeyExtractorStrategy; import org.springframework.cloud.stream.binder.test.InputDestination; import org.springframework.cloud.stream.binder.test.OutputDestination; import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration; import org.springframework.cloud.stream.binding.BinderAwareChannelResolver; import org.springframework.cloud.stream.config.BindingServiceProperties; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.messaging.Message; import org.springframework.messaging.support.GenericMessage; @@ -41,6 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** * * @author Oleg Zhurakousky + * @author David Turanski * */ public class DynamicDestinationFunctionTests { @@ -53,22 +51,21 @@ public class DynamicDestinationFunctionTests { @Test public void testEmptyConfiguration() { + TestChannelBinderConfiguration.applicationContextRunner(SampleConfiguration.class) + .withPropertyValues( + "spring.jmx.enabled=false", + "spring.cloud.stream.bindings.fooDestination.producer.partitionKeyExtractorName=keyExtractor") + .run(context -> { + InputDestination input = context.getBean(InputDestination.class); + input.send(new GenericMessage("fooDestination")); - try (ConfigurableApplicationContext context = new SpringApplicationBuilder(TestChannelBinderConfiguration - .getCompleteConfiguration(SampleConfiguration.class)).web(WebApplicationType.NONE).run( - "--spring.jmx.enabled=false", - "--spring.cloud.stream.bindings.fooDestination.producer.partitionKeyExtractorName=keyExtractor")) { - InputDestination input = context.getBean(InputDestination.class); - input.send(new GenericMessage("fooDestination")); - - BindingServiceProperties serviceProperties = context.getBean(BindingServiceProperties.class); - assertThat("keyExtractor").isEqualTo( - serviceProperties.getProducerProperties("fooDestination").getPartitionKeyExtractorName()); - - OutputDestination output = context.getBean(OutputDestination.class); - assertThat(output.receive(1000).getPayload()).isEqualTo("fooDestination".getBytes()); - } + BindingServiceProperties serviceProperties = context.getBean(BindingServiceProperties.class); + assertThat("keyExtractor").isEqualTo( + serviceProperties.getProducerProperties("fooDestination").getPartitionKeyExtractorName()); + OutputDestination output = context.getBean(OutputDestination.class); + assertThat(output.receive(1000).getPayload()).isEqualTo("fooDestination".getBytes()); + }); } @EnableAutoConfiguration diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/FunctionBatchingTests.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/FunctionBatchingTests.java index d96bbe4ac..82dc11e7c 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/FunctionBatchingTests.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/function/FunctionBatchingTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019-2019 the original author or authors. + * Copyright 2019-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,13 +22,10 @@ import java.util.function.Function; import org.junit.Test; -import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.stream.binder.test.InputDestination; import org.springframework.cloud.stream.binder.test.OutputDestination; import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; @@ -39,6 +36,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Gary Russel * @author Oleg Zhurakousky + * @author David Turanski * * @since 3.0 */ @@ -46,115 +44,108 @@ public class FunctionBatchingTests { @Test public void testMessageBatchConfiguration() { - try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - MessageBatchConfiguration.class)).web(WebApplicationType.NONE).run( - "--spring.jmx.enabled=false", - "--spring.cloud.stream.function.definition=func", - "--spring.cloud.stream.bindings.input.consumer.batch-mode=true")) { + TestChannelBinderConfiguration.applicationContextRunner(MessageBatchConfiguration.class) + .withPropertyValues("spring.jmx.enabled=false", + "spring.cloud.stream.function.definition=func", + "spring.cloud.stream.bindings.input.consumer.batch-mode=true") + .run(context -> { + InputDestination inputDestination = context.getBean(InputDestination.class); + OutputDestination outputDestination = context + .getBean(OutputDestination.class); - InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + List list = new ArrayList<>(); + list.add("{\"name\":\"bob\"}".getBytes()); + list.add("{\"name\":\"jill\"}".getBytes()); + Message> inputMessage = MessageBuilder + .withPayload(list) + .build(); + inputDestination.send(inputMessage); - List list = new ArrayList<>(); - list.add("{\"name\":\"bob\"}".getBytes()); - list.add("{\"name\":\"jill\"}".getBytes()); - Message> inputMessage = MessageBuilder - .withPayload(list) - .build(); - inputDestination.send(inputMessage); + Message outputMessage = outputDestination.receive(); + assertThat(outputMessage).isNotNull(); + assertThat(outputMessage.getPayload()) + .isEqualTo("{\"name\":\"bob\"}".getBytes()); - Message outputMessage = outputDestination.receive(); - assertThat(outputMessage).isNotNull(); - assertThat(outputMessage.getPayload()) - .isEqualTo("{\"name\":\"bob\"}".getBytes()); - - context.stop(); - } + context.stop(); + }); } @Test public void testListPayloadConfiguration() { - try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - ListPayloadNotBatchConfiguration.class)).web(WebApplicationType.NONE).run( - "--spring.jmx.enabled=false", - "--spring.cloud.stream.function.definition=func")) { + TestChannelBinderConfiguration.applicationContextRunner(ListPayloadNotBatchConfiguration.class) + .withPropertyValues("spring.jmx.enabled=false", + "spring.cloud.stream.function.definition=func") + .run(context -> { + InputDestination inputDestination = context.getBean(InputDestination.class); + OutputDestination outputDestination = context + .getBean(OutputDestination.class); - InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + Message inputMessage = MessageBuilder + .withPayload("[{\"name\":\"bob\"},{\"name\":\"jill\"}]".getBytes()) + .build(); + inputDestination.send(inputMessage); - Message inputMessage = MessageBuilder - .withPayload("[{\"name\":\"bob\"},{\"name\":\"jill\"}]".getBytes()) - .build(); - inputDestination.send(inputMessage); + Message outputMessage = outputDestination.receive(); + assertThat(outputMessage).isNotNull(); + assertThat(outputMessage.getPayload()) + .isEqualTo("{\"name\":\"bob\"}".getBytes()); - Message outputMessage = outputDestination.receive(); - assertThat(outputMessage).isNotNull(); - assertThat(outputMessage.getPayload()) - .isEqualTo("{\"name\":\"bob\"}".getBytes()); - - context.stop(); - } + context.stop(); + }); } @Test public void testSimpleBatchConfiguration() { - try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - SimpleBatchConfiguration.class)).web(WebApplicationType.NONE).run( - "--spring.jmx.enabled=false", - "--spring.cloud.stream.function.definition=func", - "--spring.cloud.stream.bindings.input.consumer.batch-mode=true")) { + TestChannelBinderConfiguration.applicationContextRunner(SimpleBatchConfiguration.class) + .withPropertyValues( + "spring.jmx.enabled=false", + "spring.cloud.stream.function.definition=func", + "spring.cloud.stream.bindings.input.consumer.batch-mode=true") + .run(context -> { + InputDestination inputDestination = context.getBean(InputDestination.class); + OutputDestination outputDestination = context + .getBean(OutputDestination.class); - InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + List list = new ArrayList<>(); + list.add("{\"name\":\"bob\"}".getBytes()); + list.add("{\"name\":\"jill\"}".getBytes()); + Message> inputMessage = MessageBuilder + .withPayload(list) + .build(); + inputDestination.send(inputMessage); - List list = new ArrayList<>(); - list.add("{\"name\":\"bob\"}".getBytes()); - list.add("{\"name\":\"jill\"}".getBytes()); - Message> inputMessage = MessageBuilder - .withPayload(list) - .build(); - inputDestination.send(inputMessage); - - Message outputMessage = outputDestination.receive(); - assertThat(outputMessage).isNotNull(); - assertThat(outputMessage.getPayload()) - .isEqualTo("{\"name\":\"bob\"}".getBytes()); - context.stop(); - } + Message outputMessage = outputDestination.receive(); + assertThat(outputMessage).isNotNull(); + assertThat(outputMessage.getPayload()) + .isEqualTo("{\"name\":\"bob\"}".getBytes()); + context.stop(); + }); } @Test public void testNestedBatchConfiguration() { - try (ConfigurableApplicationContext context = new SpringApplicationBuilder( - TestChannelBinderConfiguration.getCompleteConfiguration( - NestedBatchConfiguration.class)).web(WebApplicationType.NONE).run( - "--spring.jmx.enabled=false", - "--spring.cloud.stream.function.definition=func", - "--spring.cloud.stream.bindings.input.consumer.batch-mode=true")) { + TestChannelBinderConfiguration.applicationContextRunner(NestedBatchConfiguration.class) + .withPropertyValues("spring.jmx.enabled=false", + "spring.cloud.stream.function.definition=func", + "spring.cloud.stream.bindings.input.consumer.batch-mode=true") + .run(context -> { + InputDestination inputDestination = context.getBean(InputDestination.class); + OutputDestination outputDestination = context + .getBean(OutputDestination.class); - InputDestination inputDestination = context.getBean(InputDestination.class); - OutputDestination outputDestination = context - .getBean(OutputDestination.class); + List list = new ArrayList<>(); + list.add("[{\"name\":\"bob\"},{\"name\":\"jill\"}]".getBytes()); + Message> inputMessage = MessageBuilder + .withPayload(list) + .build(); + inputDestination.send(inputMessage); - List list = new ArrayList<>(); - list.add("[{\"name\":\"bob\"},{\"name\":\"jill\"}]".getBytes()); - Message> inputMessage = MessageBuilder - .withPayload(list) - .build(); - inputDestination.send(inputMessage); - - Message outputMessage = outputDestination.receive(); - assertThat(outputMessage).isNotNull(); - assertThat(outputMessage.getPayload()) - .isEqualTo("{\"name\":\"bob\"}".getBytes()); - context.stop(); - } + Message outputMessage = outputDestination.receive(); + assertThat(outputMessage).isNotNull(); + assertThat(outputMessage.getPayload()) + .isEqualTo("{\"name\":\"bob\"}".getBytes()); + context.stop(); + }); } @EnableAutoConfiguration