5 changed files with 152 additions and 4 deletions
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
/* |
||||
* Copyright 2012-2014 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.actuate; |
||||
|
||||
import org.springframework.boot.test.AbstractConfigurationClassTests; |
||||
|
||||
/** |
||||
* Tests for the actuator module's @Configuration classes |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public class ActuatorConfigurationClassTests extends AbstractConfigurationClassTests { |
||||
|
||||
} |
||||
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
/* |
||||
* Copyright 2012-2014 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.autoconfigure; |
||||
|
||||
import org.springframework.boot.test.AbstractConfigurationClassTests; |
||||
|
||||
/** |
||||
* Tests for the autoconfigure module's @Configuration classes |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public class AutoConfigureConfigurationClassTests extends AbstractConfigurationClassTests { |
||||
|
||||
} |
||||
@ -0,0 +1,94 @@
@@ -0,0 +1,94 @@
|
||||
/* |
||||
* Copyright 2012-2014 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. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.boot.test; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.HashSet; |
||||
import java.util.Set; |
||||
|
||||
import org.junit.Test; |
||||
import org.springframework.asm.Opcodes; |
||||
import org.springframework.beans.DirectFieldAccessor; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.core.io.Resource; |
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; |
||||
import org.springframework.core.io.support.ResourcePatternResolver; |
||||
import org.springframework.core.type.AnnotationMetadata; |
||||
import org.springframework.core.type.MethodMetadata; |
||||
import org.springframework.core.type.classreading.MetadataReader; |
||||
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory; |
||||
|
||||
import static org.junit.Assert.assertEquals; |
||||
|
||||
/** |
||||
* @author Andy Wilkinson |
||||
*/ |
||||
public abstract class AbstractConfigurationClassTests { |
||||
|
||||
private ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); |
||||
|
||||
@Test |
||||
public void allBeanMethodsArePublic() throws IOException, ClassNotFoundException { |
||||
Set<String> nonPublicBeanMethods = new HashSet<String>(); |
||||
for (AnnotationMetadata configurationClass : findConfigurationClasses()) { |
||||
Set<MethodMetadata> beanMethods = configurationClass |
||||
.getAnnotatedMethods(Bean.class.getName()); |
||||
for (MethodMetadata methodMetadata : beanMethods) { |
||||
if (!isPublic(methodMetadata)) { |
||||
nonPublicBeanMethods.add(methodMetadata.getDeclaringClassName() + "." |
||||
+ methodMetadata.getMethodName()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
assertEquals("Found non-public @Bean methods: " + nonPublicBeanMethods, 0, |
||||
nonPublicBeanMethods.size()); |
||||
} |
||||
|
||||
private Set<AnnotationMetadata> findConfigurationClasses() throws IOException { |
||||
Set<AnnotationMetadata> configurationClasses = new HashSet<AnnotationMetadata>(); |
||||
Resource[] resources = this.resolver.getResources("classpath*:" |
||||
+ getClass().getPackage().getName().replace(".", "/") + "/**/*.class"); |
||||
|
||||
for (Resource resource : resources) { |
||||
if (!isTestClass(resource)) { |
||||
MetadataReader metadataReader = new SimpleMetadataReaderFactory() |
||||
.getMetadataReader(resource); |
||||
AnnotationMetadata annotationMetadata = metadataReader |
||||
.getAnnotationMetadata(); |
||||
if (annotationMetadata.getAnnotationTypes().contains( |
||||
Configuration.class.getName())) { |
||||
configurationClasses.add(annotationMetadata); |
||||
} |
||||
} |
||||
} |
||||
return configurationClasses; |
||||
} |
||||
|
||||
private boolean isTestClass(Resource resource) throws IOException { |
||||
return resource.getFile().getAbsolutePath().contains("target/test-classes"); |
||||
} |
||||
|
||||
private boolean isPublic(MethodMetadata methodMetadata) { |
||||
int access = (Integer) new DirectFieldAccessor(methodMetadata) |
||||
.getPropertyValue("access"); |
||||
|
||||
return (access & Opcodes.ACC_PUBLIC) != 0; |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue