/* * Copyright 2011 <a href="mailto:lincolnbaxter@gmail.com">Lincoln Baxter, III</a> * * 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.ocpsoft.rewrite.annotation.scan; import java.lang.annotation.Annotation; import java.net.URL; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import javax.servlet.ServletContext; import org.junit.Ignore; import org.junit.Test; import org.mockito.Mockito; import org.ocpsoft.rewrite.annotation.api.ClassVisitor; @SuppressWarnings({ "unchecked", "rawtypes" }) @Ignore // ignored since we now user Class.forName(name, false, cl) which we cannot mock public class WebClassesFinderTest { @Test public void testWebClassesFinder() throws Exception { // URLs of simulated directories and files URL classesUrl = new URL("file:/somewhere/WEB-INF/classes/"); URL packageUrl = new URL("file:/somewhere/WEB-INF/classes/package/"); URL classUrl = new URL("file:/somewhere/WEB-INF/classes/package/TestClass.class"); // Contents of directories Set<String> classesDirectory = new HashSet<String>(Arrays.asList("/WEB-INF/classes/package/")); Set<String> packageDirectory = new HashSet<String>(Arrays.asList("/WEB-INF/classes/package/TestClass.class")); // Create filter accepting all packages PackageFilter filter = new PackageFilter(null); // Mock of ServletContext that knows the directories and files ServletContext servletContext = Mockito.mock(ServletContext.class); Mockito.when(servletContext.getResource("/WEB-INF/classes/")).thenReturn(classesUrl); Mockito.when(servletContext.getResourcePaths("/WEB-INF/classes/")).thenReturn(classesDirectory); Mockito.when(servletContext.getResource("/WEB-INF/classes/package/")).thenReturn(packageUrl); Mockito.when(servletContext.getResourcePaths("/WEB-INF/classes/package/")).thenReturn(packageDirectory); Mockito.when(servletContext.getResource("/WEB-INF/classes/package/TestClass.class")).thenReturn(classUrl); // ClassLoader that knows the test class ClassLoader classLoader = Mockito.mock(ClassLoader.class); Mockito.when(classLoader.loadClass("package.TestClass")).thenReturn((Class) ClassFinderTestBean.class); // Create the ByteCodeFilter Set<Class<? extends Annotation>> types = new HashSet<Class<? extends Annotation>>(); types.add(TestAnnotation.class); ByteCodeFilter byteCodeFilter = new ByteCodeFilter(types); // Mock the visitor for verification ClassVisitor classVisitor = Mockito.mock(ClassVisitor.class); // Run finder WebClassesFinder finder = new WebClassesFinder(servletContext, classLoader, filter, byteCodeFilter); finder.findClasses(classVisitor); // Verify that the PrettyAnnotationHandler has been notified Mockito.verify(classVisitor).visit(ClassFinderTestBean.class); } @Test public void testWebClassesFinderWithJettyRunGoal() throws Exception { // URLs do not contain '/WEB-INF/classes/' but the Maven '/target/classes/' folder URL classesUrl = new URL("file:/somewhere/myproject/target/classes/"); URL packageUrl = new URL("file:/somewhere/myproject/target/classes/package/"); URL classUrl = new URL("file:/somewhere/myproject/target/classes/package/TestClass.class"); // Contents of directories Set<String> classesDirectory = new HashSet<String>(Arrays.asList("/WEB-INF/classes/package/")); Set<String> packageDirectory = new HashSet<String>(Arrays.asList("/WEB-INF/classes/package/TestClass.class")); // Create filter accepting all packages PackageFilter filter = new PackageFilter(null); // Mock of ServletContext that knows the directories and files ServletContext servletContext = Mockito.mock(ServletContext.class); Mockito.when(servletContext.getResource("/WEB-INF/classes/")).thenReturn(classesUrl); Mockito.when(servletContext.getResourcePaths("/WEB-INF/classes/")).thenReturn(classesDirectory); Mockito.when(servletContext.getResource("/WEB-INF/classes/package/")).thenReturn(packageUrl); Mockito.when(servletContext.getResourcePaths("/WEB-INF/classes/package/")).thenReturn(packageDirectory); Mockito.when(servletContext.getResource("/WEB-INF/classes/package/TestClass.class")).thenReturn(classUrl); // ClassLoader that knows the test class ClassLoader classLoader = Mockito.mock(ClassLoader.class); Mockito.when(classLoader.loadClass("package.TestClass")).thenReturn((Class) ClassFinderTestBean.class); // We will need the ByteCodeFilter Set<Class<? extends Annotation>> types = new HashSet<Class<? extends Annotation>>(); types.add(TestAnnotation.class); ByteCodeFilter byteCodeFilter = new ByteCodeFilter(types); // Mock the visitor for verification ClassVisitor classVisitor = Mockito.mock(ClassVisitor.class); // Run finder WebClassesFinder finder = new WebClassesFinder(servletContext, classLoader, filter, byteCodeFilter); finder.findClasses(classVisitor); // Verify that the PrettyAnnotationHandler has been notified Mockito.verify(classVisitor).visit(ClassFinderTestBean.class); } }