Skip to content

Commit d8ece7c

Browse files
authored
Feature management docs junit5 (Azure#24266)
* Added evaulate option, Added AlwaysOnFilter, updated to JUnit5 * Fixed pom * Fixed missing d in enabled in Readme * Removed extra l * Updated alwayson wording * Updated alwayson wording * Removed Evaluate code
1 parent 8bc5458 commit d8ece7c

File tree

10 files changed

+86
-63
lines changed

10 files changed

+86
-63
lines changed

sdk/appconfiguration/azure-spring-cloud-feature-management/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## 2.1.0-beta.1 (Unreleased)
44

5+
- Updated to JUnit 5
56

67
## 2.0.0 (2021-06-21)
78

sdk/appconfiguration/azure-spring-cloud-feature-management/pom.xml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,6 @@
4141
<artifactId>reactor-netty</artifactId>
4242
<version>1.0.10</version> <!-- {x-version-update;io.projectreactor.netty:reactor-netty;external_dependency} -->
4343
</dependency>
44-
<dependency>
45-
<groupId>junit</groupId>
46-
<artifactId>junit</artifactId>
47-
<version>4.13.2</version> <!-- {x-version-update;junit:junit;external_dependency} -->
48-
<scope>test</scope>
49-
</dependency>
50-
<dependency>
51-
<groupId>org.mockito</groupId>
52-
<artifactId>mockito-core</artifactId>
53-
<version>3.9.0</version><!-- {x-version-update;org.mockito:mockito-core;external_dependency} -->
54-
<scope>test</scope>
55-
</dependency>
5644
<dependency>
5745
<groupId>org.springframework.boot</groupId>
5846
<artifactId>spring-boot-starter-test</artifactId>

sdk/appconfiguration/azure-spring-cloud-feature-management/src/test/java/com/azure/spring/cloud/feature/manager/FeatureManagerTest.java

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,36 @@
22
// Licensed under the MIT License.
33
package com.azure.spring.cloud.feature.manager;
44

5-
import static org.junit.Assert.assertEquals;
6-
import static org.junit.Assert.assertFalse;
7-
import static org.junit.Assert.assertNotNull;
8-
import static org.junit.Assert.assertTrue;
9-
import static org.junit.Assert.fail;
5+
import static org.assertj.core.api.Assertions.assertThat;
6+
import static org.junit.jupiter.api.Assertions.assertEquals;
7+
import static org.junit.jupiter.api.Assertions.assertFalse;
8+
import static org.junit.jupiter.api.Assertions.assertNotNull;
9+
import static org.junit.jupiter.api.Assertions.assertThrows;
10+
import static org.junit.jupiter.api.Assertions.assertTrue;
1011
import static org.mockito.Mockito.when;
1112

1213
import java.util.HashMap;
1314
import java.util.LinkedHashMap;
1415
import java.util.concurrent.ExecutionException;
15-
import org.junit.Before;
16-
import org.junit.Rule;
17-
import org.junit.Test;
18-
import org.junit.rules.ExpectedException;
19-
import org.junit.runner.RunWith;
16+
17+
import org.junit.jupiter.api.AfterEach;
18+
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.Test;
2020
import org.mockito.InjectMocks;
2121
import org.mockito.Mock;
2222
import org.mockito.Mockito;
2323
import org.mockito.MockitoAnnotations;
24-
import org.mockito.junit.MockitoJUnitRunner;
2524
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
25+
import org.springframework.boot.test.context.SpringBootTest;
2626
import org.springframework.context.ApplicationContext;
27-
import org.springframework.stereotype.Component;
2827

29-
import com.azure.spring.cloud.feature.manager.FeatureFilter;
30-
import com.azure.spring.cloud.feature.manager.FeatureManagementConfigProperties;
31-
import com.azure.spring.cloud.feature.manager.FeatureManager;
32-
import com.azure.spring.cloud.feature.manager.FilterNotFoundException;
3328
import com.azure.spring.cloud.feature.manager.entities.Feature;
3429
import com.azure.spring.cloud.feature.manager.entities.FeatureFilterEvaluationContext;
3530

3631
/**
3732
* Unit tests for FeatureManager.
3833
*/
39-
@RunWith(MockitoJUnitRunner.class)
34+
@SpringBootTest(classes = { TestConfiguration.class, SpringBootTest.class })
4035
public class FeatureManagerTest {
4136

4237
private static final String FEATURE_KEY = "TestFeature";
@@ -46,21 +41,27 @@ public class FeatureManagerTest {
4641
private static final String PARAM_1_NAME = "param1";
4742

4843
private static final String PARAM_1_VALUE = "testParam";
49-
@Rule
50-
public ExpectedException expectedEx = ExpectedException.none();
44+
5145
@InjectMocks
5246
private FeatureManager featureManager;
47+
5348
@Mock
5449
private ApplicationContext context;
50+
5551
@Mock
5652
private FeatureManagementConfigProperties properties;
5753

58-
@Before
54+
@BeforeEach
5955
public void setup() {
60-
MockitoAnnotations.initMocks(this);
56+
MockitoAnnotations.openMocks(this);
6157
when(properties.isFailFast()).thenReturn(true);
6258
}
6359

60+
@AfterEach
61+
public void cleanup() throws Exception {
62+
MockitoAnnotations.openMocks(this).close();
63+
}
64+
6465
/**
6566
* Tests the conversion that takes place when data comes from EnumerablePropertySource.
6667
*/
@@ -127,16 +128,15 @@ public void isEnabledON() throws InterruptedException, ExecutionException, Filte
127128
HashMap<String, Object> features = new HashMap<String, Object>();
128129
Feature onFeature = new Feature();
129130
onFeature.setKey("On");
130-
HashMap<Integer, FeatureFilterEvaluationContext> filters =
131-
new HashMap<Integer, FeatureFilterEvaluationContext>();
131+
HashMap<Integer, FeatureFilterEvaluationContext> filters = new HashMap<Integer, FeatureFilterEvaluationContext>();
132132
FeatureFilterEvaluationContext alwaysOn = new FeatureFilterEvaluationContext();
133133
alwaysOn.setName("AlwaysOn");
134134
filters.put(0, alwaysOn);
135135
onFeature.setEnabledFor(filters);
136136
features.put("On", onFeature);
137137
featureManager.putAll(features);
138138

139-
when(context.getBean(Mockito.matches("AlwaysOn"))).thenReturn(new AlwaysOn());
139+
when(context.getBean(Mockito.matches("AlwaysOn"))).thenReturn(new AlwaysOnFilter());
140140

141141
assertTrue(featureManager.isEnabledAsync("On").block());
142142
}
@@ -189,8 +189,7 @@ public void bootstrapConfiguration() {
189189
HashMap<String, Object> features = new HashMap<String, Object>();
190190
features.put("FeatureU", false);
191191
Feature featureV = new Feature();
192-
HashMap<Integer, FeatureFilterEvaluationContext> filterMapper =
193-
new HashMap<Integer, FeatureFilterEvaluationContext>();
192+
HashMap<Integer, FeatureFilterEvaluationContext> filterMapper = new HashMap<Integer, FeatureFilterEvaluationContext>();
194193

195194
FeatureFilterEvaluationContext enabledFor = new FeatureFilterEvaluationContext();
196195
enabledFor.setName("Random");
@@ -219,13 +218,10 @@ public void bootstrapConfiguration() {
219218

220219
@Test
221220
public void noFilter() throws FilterNotFoundException {
222-
expectedEx.expect(FilterNotFoundException.class);
223-
expectedEx.expectMessage("Fail fast is set and a Filter was unable to be found: AlwaysOff");
224221
HashMap<String, Object> features = new HashMap<String, Object>();
225222
Feature onFeature = new Feature();
226223
onFeature.setKey("Off");
227-
HashMap<Integer, FeatureFilterEvaluationContext> filters =
228-
new HashMap<Integer, FeatureFilterEvaluationContext>();
224+
HashMap<Integer, FeatureFilterEvaluationContext> filters = new HashMap<Integer, FeatureFilterEvaluationContext>();
229225
FeatureFilterEvaluationContext alwaysOn = new FeatureFilterEvaluationContext();
230226
alwaysOn.setName("AlwaysOff");
231227
filters.put(0, alwaysOn);
@@ -235,12 +231,12 @@ public void noFilter() throws FilterNotFoundException {
235231

236232
when(context.getBean(Mockito.matches("AlwaysOff"))).thenThrow(new NoSuchBeanDefinitionException(""));
237233

238-
featureManager.isEnabledAsync("Off").block();
239-
fail();
234+
FilterNotFoundException e = assertThrows(FilterNotFoundException.class,
235+
() -> featureManager.isEnabledAsync("Off").block());
236+
assertThat(e).hasMessage("Fail fast is set and a Filter was unable to be found: AlwaysOff");
240237
}
241238

242-
@Component
243-
public class AlwaysOn implements FeatureFilter {
239+
class AlwaysOnFilter implements FeatureFilter {
244240

245241
@Override
246242
public boolean evaluate(FeatureFilterEvaluationContext context) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.azure.spring.cloud.feature.manager;
2+
3+
import java.lang.annotation.Documented;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Inherited;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
import org.junit.jupiter.api.extension.ExtendWith;
11+
import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
12+
import org.springframework.test.context.BootstrapWith;
13+
14+
@Target(value=ElementType.TYPE)
15+
@Retention(value=RetentionPolicy.RUNTIME)
16+
@Documented
17+
@Inherited
18+
@BootstrapWith(value=SpringBootTestContextBootstrapper.class)
19+
@ExtendWith(value=org.springframework.test.context.junit.jupiter.SpringExtension.class)
20+
public @interface SpringBootTest
21+
{
22+
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.azure.spring.cloud.feature.manager;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.context.annotation.Bean;
5+
import org.springframework.context.annotation.Configuration;
6+
7+
@Configuration
8+
@ConfigurationProperties
9+
public class TestConfiguration {
10+
11+
@Bean
12+
public FeatureManagementConfigProperties properties() {
13+
return new FeatureManagementConfigProperties();
14+
}
15+
}

sdk/appconfiguration/azure-spring-cloud-feature-management/src/test/java/com/azure/spring/cloud/feature/manager/feature/filters/PercentageFilterTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
package com.azure.spring.cloud.feature.manager.feature.filters;
44

55
import static com.azure.spring.cloud.feature.manager.FilterParameters.PERCENTAGE_FILTER_SETTING;
6-
import static org.junit.Assert.assertFalse;
7-
import static org.junit.Assert.assertTrue;
6+
import static org.junit.jupiter.api.Assertions.assertFalse;
7+
import static org.junit.jupiter.api.Assertions.assertTrue;
88

99
import java.util.LinkedHashMap;
10-
import org.junit.Test;
10+
11+
import org.junit.jupiter.api.Test;
1112

1213
import com.azure.spring.cloud.feature.manager.entities.FeatureFilterEvaluationContext;
13-
import com.azure.spring.cloud.feature.manager.feature.filters.PercentageFilter;
1414

1515
public class PercentageFilterTest {
1616

sdk/appconfiguration/azure-spring-cloud-feature-management/src/test/java/com/azure/spring/cloud/feature/manager/feature/filters/TargetingFilterTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,29 @@
22
// Licensed under the MIT License.
33
package com.azure.spring.cloud.feature.manager.feature.filters;
44

5-
import static org.junit.Assert.assertFalse;
6-
import static org.junit.Assert.assertTrue;
75
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
import static org.junit.jupiter.api.Assertions.assertFalse;
87
import static org.junit.jupiter.api.Assertions.assertThrows;
8+
import static org.junit.jupiter.api.Assertions.assertTrue;
99
import static org.mockito.Mockito.when;
1010

1111
import java.util.ArrayList;
1212
import java.util.LinkedHashMap;
13-
import org.junit.Test;
14-
import org.junit.runner.RunWith;
13+
14+
import org.junit.jupiter.api.Test;
1515
import org.mockito.Mock;
16-
import org.mockito.junit.MockitoJUnitRunner;
16+
import org.springframework.boot.test.context.SpringBootTest;
1717

1818
import com.azure.spring.cloud.feature.manager.TargetingException;
19+
import com.azure.spring.cloud.feature.manager.TestConfiguration;
1920
import com.azure.spring.cloud.feature.manager.entities.FeatureFilterEvaluationContext;
20-
import com.azure.spring.cloud.feature.manager.feature.filters.TargetingFilter;
2121
import com.azure.spring.cloud.feature.manager.targeting.ITargetingContextAccessor;
2222
import com.azure.spring.cloud.feature.manager.targeting.TargetingContext;
2323
import com.azure.spring.cloud.feature.manager.targeting.TargetingEvaluationOptions;
2424

2525
import reactor.core.publisher.Mono;
2626

27-
@RunWith(MockitoJUnitRunner.class)
27+
@SpringBootTest(classes = {TestConfiguration.class, SpringBootTest.class})
2828
public class TargetingFilterTest {
2929

3030
private static final String USERS = "users";

sdk/appconfiguration/azure-spring-cloud-feature-management/src/test/java/com/azure/spring/cloud/feature/manager/feature/filters/TimeWindowFilterTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44

55
import static com.azure.spring.cloud.feature.manager.FilterParameters.TIME_WINDOW_FILTER_SETTING_END;
66
import static com.azure.spring.cloud.feature.manager.FilterParameters.TIME_WINDOW_FILTER_SETTING_START;
7-
import static org.junit.Assert.assertFalse;
8-
import static org.junit.Assert.assertTrue;
7+
import static org.junit.jupiter.api.Assertions.assertFalse;
8+
import static org.junit.jupiter.api.Assertions.assertTrue;
99

1010
import java.time.ZonedDateTime;
1111
import java.time.format.DateTimeFormatter;
1212
import java.util.LinkedHashMap;
13-
import org.junit.Test;
13+
14+
import org.junit.jupiter.api.Test;
1415

1516
import com.azure.spring.cloud.feature.manager.entities.FeatureFilterEvaluationContext;
16-
import com.azure.spring.cloud.feature.manager.feature.filters.TimeWindowFilter;
1717

1818
public class TimeWindowFilterTest {
1919

sdk/appconfiguration/azure-spring-cloud-starter-appconfiguration-config/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ spring.cloud.azure.appconfiguration.stores[0].monitoring.push-notification.secon
8888

8989
Name | Description | Required | Default
9090
---|---|---|---
91-
spring.cloud.azure.appconfiguration.stores[0].feature-flags.enable | Whether feature flags are loaded from the config store. | No | false
91+
spring.cloud.azure.appconfiguration.stores[0].feature-flags.enabled | Whether feature flags are loaded from the config store. | No | false
9292
spring.cloud.azure.appconfiguration.stores[0].feature-flags.label-filter | The label used to indicate which feature flags will be loaded. | No | \0
9393

9494
### Advanced usage

sdk/appconfiguration/azure-spring-cloud-starter-appconfiguration-config/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<dependency>
2424
<groupId>com.azure.spring</groupId>
2525
<artifactId>azure-spring-cloud-feature-management-web</artifactId>
26-
<version>2.0.0</version><!-- {x-version-update;com.azure.spring:azure-spring-cloud-feature-management-web;dependency} -->
26+
<version>2.1.0-beta.1</version><!-- {x-version-update;com.azure.spring:azure-spring-cloud-feature-management-web;current} -->
2727
</dependency>
2828
</dependencies>
2929
</project>

0 commit comments

Comments
 (0)