Author: mbenson
Date: Sat Sep 21 18:09:35 2013
New Revision: 1525272

URL: http://svn.apache.org/r1525272
Log:
add the ability to add additional types when stubbing

Modified:
    
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/AnnotationBuilder.java
    
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/StubBuilder.java
    
commons/proper/proxy/branches/version-2.0-work/test/src/test/java/org/apache/commons/proxy2/stub/StubBuilderTest.java

Modified: 
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/AnnotationBuilder.java
URL: 
http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/AnnotationBuilder.java?rev=1525272&r1=1525271&r2=1525272&view=diff
==============================================================================
--- 
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/AnnotationBuilder.java
 (original)
+++ 
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/AnnotationBuilder.java
 Sat Sep 21 18:09:35 2013
@@ -168,7 +168,7 @@ public class AnnotationBuilder<A extends
 
         MapAnnotationTrainer(Map<String, ?> members)
         {
-            super(type);
+            super(annotationType);
             this.members = members;
         }
 
@@ -220,19 +220,24 @@ public class AnnotationBuilder<A extends
         return new AnnotationBuilder<A>(type, target);
     }
 
+    private final Class<A> annotationType;
+
     private AnnotationBuilder(Class<A> type, Invoker invoker)
     {
         super(PROXY_FACTORY, type, invoker);
+        this.annotationType = type;
     }
 
     private AnnotationBuilder(Class<A> type, ObjectProvider<? extends A> 
provider)
     {
         super(PROXY_FACTORY, type, provider);
+        this.annotationType = type;
     }
 
     private AnnotationBuilder(Class<A> type, A target)
     {
         super(PROXY_FACTORY, type, target);
+        this.annotationType = type;
     }
 
     public AnnotationBuilder<A> withMembers(Map<String, ?> members)
@@ -241,19 +246,19 @@ public class AnnotationBuilder<A extends
     }
 
     @Override
-    public AnnotationBuilder<A> train(BaseTrainer<?, ? super A> trainer)
+    public <O> AnnotationBuilder<A> train(BaseTrainer<?, O> trainer)
     {
         return (AnnotationBuilder<A>) super.train(trainer);
     }
 
     @Override
     public A build() {
-        train(new AnnotationTrainer<A>(type)
+        train(new AnnotationTrainer<A>(annotationType)
         {
             @Override
             protected void train(A trainee)
             {
-                when(trainee.annotationType()).thenReturn(type);
+                when(trainee.annotationType()).thenReturn(annotationType);
             }
         });
         return super.build();

Modified: 
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/StubBuilder.java
URL: 
http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/StubBuilder.java?rev=1525272&r1=1525271&r2=1525272&view=diff
==============================================================================
--- 
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/StubBuilder.java
 (original)
+++ 
commons/proper/proxy/branches/version-2.0-work/core/src/main/java/org/apache/commons/proxy2/stub/StubBuilder.java
 Sat Sep 21 18:09:35 2013
@@ -17,6 +17,12 @@
 
 package org.apache.commons.proxy2.stub;
 
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.Validate;
 import org.apache.commons.lang3.builder.Builder;
 import org.apache.commons.proxy2.Invoker;
 import org.apache.commons.proxy2.ObjectProvider;
@@ -31,10 +37,10 @@ public class StubBuilder<T> implements B
 // Fields
 
//----------------------------------------------------------------------------------------------------------------------
 
-    protected final Class<T> type;
     private final ProxyFactory proxyFactory;
     private final T target;
     private final SwitchInterceptor switchInterceptor = new 
SwitchInterceptor();
+    private final Set<Class<?>> proxyTypes = new HashSet<Class<?>>();
 
 
//----------------------------------------------------------------------------------------------------------------------
 // Constructors
@@ -48,22 +54,22 @@ public class StubBuilder<T> implements B
     public StubBuilder(ProxyFactory proxyFactory, Class<T> type, Invoker 
invoker)
     {
         this.proxyFactory = proxyFactory;
-        this.type = type;
         this.target = proxyFactory.createInvokerProxy(invoker, type);
+        this.proxyTypes.add(Validate.notNull(type));
     }
     
     public StubBuilder(ProxyFactory proxyFactory, Class<T> type, 
ObjectProvider<? extends T> provider)
     {
         this.proxyFactory = proxyFactory;
-        this.type = type;
         this.target = proxyFactory.createDelegatorProxy(provider, type);
+        this.proxyTypes.add(Validate.notNull(type));
     }
 
     public StubBuilder(ProxyFactory proxyFactory, Class<T> type, T target)
     {
         this.proxyFactory = proxyFactory;
-        this.type = type;
         this.target = proxyFactory.createDelegatorProxy(new 
ConstantProvider<T>(target), type);
+        this.proxyTypes.add(Validate.notNull(type));
     }
 
 
//----------------------------------------------------------------------------------------------------------------------
@@ -72,16 +78,18 @@ public class StubBuilder<T> implements B
 
     public T build()
     {
-        return proxyFactory.createInterceptorProxy(target, switchInterceptor, 
type);
+        return proxyFactory.createInterceptorProxy(target, switchInterceptor,
+                proxyTypes.toArray(ArrayUtils.EMPTY_CLASS_ARRAY));
     }
 
-    public StubBuilder<T> train(BaseTrainer<?, ? super T> trainer)
+    public <O> StubBuilder<T> train(BaseTrainer<?, O> trainer)
     {
         try
         {
             TrainingContext trainingContext = 
TrainingContext.set(proxyFactory);
-            T trainee = trainingContext.push(type, switchInterceptor);
+            final O trainee = trainingContext.push(trainer.traineeType, 
switchInterceptor);
             trainer.train(trainee);
+            proxyTypes.add(trainer.traineeType);
         }
         finally
         {
@@ -89,4 +97,10 @@ public class StubBuilder<T> implements B
         }
         return this;
     }
+
+    public StubBuilder<T> addProxyTypes(Class<?>... proxyTypes)
+    {
+        Collections.addAll(this.proxyTypes, 
Validate.noNullElements(proxyTypes));
+        return this;
+    }
 }

Modified: 
commons/proper/proxy/branches/version-2.0-work/test/src/test/java/org/apache/commons/proxy2/stub/StubBuilderTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/proxy/branches/version-2.0-work/test/src/test/java/org/apache/commons/proxy2/stub/StubBuilderTest.java?rev=1525272&r1=1525271&r2=1525272&view=diff
==============================================================================
--- 
commons/proper/proxy/branches/version-2.0-work/test/src/test/java/org/apache/commons/proxy2/stub/StubBuilderTest.java
 (original)
+++ 
commons/proper/proxy/branches/version-2.0-work/test/src/test/java/org/apache/commons/proxy2/stub/StubBuilderTest.java
 Sat Sep 21 18:09:35 2013
@@ -19,9 +19,15 @@ package org.apache.commons.proxy2.stub;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Iterator;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.proxy2.ObjectProvider;
 import org.apache.commons.proxy2.provider.BeanProvider;
+import org.apache.commons.proxy2.provider.ObjectProviderUtils;
 import org.junit.Test;
 
 public class StubBuilderTest extends AbstractStubTestCase
@@ -94,6 +100,33 @@ public class StubBuilderTest extends Abs
         assertEquals("Bar", stub.one("Foo"));
     }
 
+    @Test
+    public void testAdditionalInterfaces() {
+        StubBuilder<StubInterface> builder = new 
StubBuilder<StubInterface>(proxyFactory, StubInterface.class,
+                ObjectProviderUtils.constant(new SimpleStub()));
+        builder.train(new Trainer<Iterable<String>>()
+        {
+
+            @Override
+            protected void train(Iterable<String> trainee)
+            {
+                when(trainee.iterator()).thenAnswer(new 
ObjectProvider<Iterator<String>>()
+                {
+                    @Override
+                    public Iterator<String> getObject()
+                    {
+                        return Arrays.asList("foo", "bar", "baz").iterator();
+                    }
+                });
+            }
+        });
+        builder.addProxyTypes(Cloneable.class, Marker.class);
+        StubInterface stub = builder.build();
+        assertTrue(stub instanceof Iterable<?>);
+        assertTrue(stub instanceof Cloneable);
+        assertTrue(stub instanceof Marker);
+    }
+
 
//----------------------------------------------------------------------------------------------------------------------
 // Inner Classes
 
//----------------------------------------------------------------------------------------------------------------------
@@ -190,4 +223,8 @@ public class StubBuilderTest extends Abs
             return null;
         }
     }
+
+    public interface Marker
+    {
+    }
 }


Reply via email to