I'm trying to create an @Mock object from a concrete class with
EasyMock using the classextension.EasyMock, as described here:
http://jeantessier.com/SoftwareEngineering/Mocking.html#MockingClasses
But AtUnit doesn't seem to support that. Is there a way to configure
AtUnit to do that (or I could just extract the concrete class to an
interface).
Here's the error:
java.lang.IllegalArgumentException: com.webwars.addwars.ConcreteClass
is not an interface
at java.lang.reflect.Proxy.getProxyClass(Proxy.java:362)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
at org.easymock.internal.JavaProxyFactory.createProxy
(JavaProxyFactory.java:12)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:
36)
at org.easymock.EasyMock.createStrictMock(EasyMock.java:28)
at atunit.easymock.EasyMockFramework.getValues(EasyMockFramework.java:
36)
at atunit.AtUnit.createTest(AtUnit.java:72)
at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod
(JUnit4ClassRunner.java:87)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods
(JUnit4ClassRunner.java:59)
at org.junit.internal.runners.JUnit4ClassRunner$1.run
(JUnit4ClassRunner.java:52)
at org.junit.internal.runners.ClassRoadie.runUnprotected
(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected
(ClassRoadie.java:44)
at org.junit.internal.runners.JUnit4ClassRunner.run
(JUnit4ClassRunner.java:50)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run
(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run
(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main
(RemoteTestRunner.java:196)
Here's an example:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import atunit.AtUnit;
import atunit.Container;
import atunit.Mock;
import atunit.MockFramework;
import atunit.Unit;
import com.google.inject.Inject;
/**
* @author ddaniels
*
*/
@RunWith(AtUnit.class)
@MockFramework(MockFramework.Option.EASYMOCK) // tells AtUnit to use
EasyMock
@Container(Container.Option.GUICE)
public class ConcreteClassMockTest {
@Inject @Unit private TestClass testClass;
@Mock ConcreteClass concreteClass;
@Test
public void testClass() {
assertEquals(0, testClass.getConcreteClass().val);
}
}
class ConcreteClass {
public int val = 0;
}
class TestClass {
@Inject private ConcreteClass concreteClass;
public ConcreteClass getConcreteClass() {
return concreteClass;
}
public void setConcreteClass(ConcreteClass concreteClass) {
this.concreteClass = concreteClass;
}
}