Hi, im having some trouble mocking final classes. Or more exact StringBuffer.
Below is a modification of the http://code.google.com/p/powermock/wiki/MockConstructor example (basicly changed from File to StringBuffer).
Shouldn’t it be possible to mock StringBuffer? Or am I doing something wrong?
Error I get is:
Cannot subclass final class class java.lang.StringBuffer
java.lang.IllegalArgumentException: Cannot subclass final class class java.lang.StringBuffer
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
at org.powermock.api.easymock.internal.signedsupport.SignedSupportingClassProxyFactory.createProxy(SignedSupportingClassProxyFactory.java:155)
at org.easymock.internal.MocksControl.createMock(MocksControl.java:40)
at org.powermock.api.easymock.PowerMock.doMock(PowerMock.java:2089)
at org.powermock.api.easymock.PowerMock.createMock(PowerMock.java:92)
at javaapplication32.NewClassTest.testCreateDirectoryStructure_ok(NewClassTest.java:29)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$2.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:217)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$2.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:207)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:202)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:156)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:130)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:128)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:112)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:44)
/Micke
*******************************’
public final class NewClass {
public String createDirectoryStructure(String directoryPath) {
StringBuffer directory = new StringBuffer(directoryPath);
directory.capacity();
return directory.toString();
}
}
import java.io.File;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.easymock.PowerMock.*;
import static org.easymock.EasyMock.expect;
@RunWith(PowerMockRunner.class)
@PrepareForTest( {StringBuffer.class, NewClass.class} )
public class NewClassTest {
@Test
public void testCreateDirectoryStructure_ok() throws Exception {
final String path = "directoryPath";
StringBuffer stringBufferMock = createMock(StringBuffer.class);
NewClass tested = new NewClass();
expectNew(StringBuffer.class, path).andReturn(stringBufferMock);
expect(stringBufferMock.capacity()).andReturn(1);
replay(stringBufferMock, File.class);
tested.createDirectoryStructure(path);
verify(stringBufferMock, File.class);
}
}
Ah your right. I should really use state verification instead. But I can only find how to get the internal state of fields. This is afteral a variable that just lives inside a method, I cant find any way to get a hold of that variable? Im pretty new too mocking so it might be me but still…
I had a feeling it was since it was a final system class it didn’t work J
/Micke