Skip to content

Commit

Permalink
Fixed issue 152
Browse files Browse the repository at this point in the history
User should be able to configure the mock to be serializable and have extra interfaces

--HG--
extra : convert_revision : svn%3Aaa2aecf3-ea3e-0410-9d70-716747e7c967/trunk%401768
  • Loading branch information
mockitoguy committed Nov 21, 2009
1 parent b6790ee commit 77cb203
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 15 deletions.
11 changes: 4 additions & 7 deletions src/org/mockito/internal/creation/MockSettingsImpl.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -9,9 +9,6 @@
import org.mockito.internal.util.MockName; import org.mockito.internal.util.MockName;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;


import java.util.Arrays;
import java.io.Serializable;

public class MockSettingsImpl implements MockSettings { public class MockSettingsImpl implements MockSettings {


private static final long serialVersionUID = 4475297236197939568L; private static final long serialVersionUID = 4475297236197939568L;
Expand All @@ -20,9 +17,11 @@ public class MockSettingsImpl implements MockSettings {
private Object spiedInstance; private Object spiedInstance;
private Answer<Object> defaultAnswer; private Answer<Object> defaultAnswer;
private MockName mockName; private MockName mockName;
private boolean serializable;


public MockSettings serializable() { public MockSettings serializable() {
return this.extraInterfaces(Serializable.class); this.serializable = true;
return this;
} }


public MockSettings extraInterfaces(Class<?>... extraInterfaces) { public MockSettings extraInterfaces(Class<?>... extraInterfaces) {
Expand Down Expand Up @@ -74,9 +73,7 @@ public Answer<Object> getDefaultAnswer() {
} }


public boolean isSerializable() { public boolean isSerializable() {
return return serializable;
extraInterfaces != null
&& Arrays.asList(extraInterfaces).contains(Serializable.class);
} }


public void initiateMockName(Class classToMock) { public void initiateMockName(Class classToMock) {
Expand Down
11 changes: 11 additions & 0 deletions src/org/mockito/internal/util/ArrayUtils.java
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.mockito.internal.util;

public class ArrayUtils {
public Class<?>[] concat(Class<?>[] interfaces, Class<?> clazz) {
int length = interfaces.length;
Class[] out = new Class[length +1];
System.arraycopy(interfaces, 0, out, 0, length);
out[length] = clazz;
return out;
}
}
11 changes: 10 additions & 1 deletion src/org/mockito/internal/util/MockUtil.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import org.mockito.internal.creation.jmock.ClassImposterizer; import org.mockito.internal.creation.jmock.ClassImposterizer;
import org.mockito.internal.util.reflection.LenientCopyTool; import org.mockito.internal.util.reflection.LenientCopyTool;


import java.io.Serializable;

@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class MockUtil { public class MockUtil {


Expand All @@ -39,7 +41,14 @@ public <T> T createMock(Class<T> classToMock, MockSettingsImpl settings) {
MockHandler<T> mockHandler = new MockHandler<T>(settings); MockHandler<T> mockHandler = new MockHandler<T>(settings);
MethodInterceptorFilter filter = new MethodInterceptorFilter(mockHandler, settings); MethodInterceptorFilter filter = new MethodInterceptorFilter(mockHandler, settings);
Class<?>[] interfaces = settings.getExtraInterfaces(); Class<?>[] interfaces = settings.getExtraInterfaces();
Class<?>[] ancillaryTypes = interfaces == null ? new Class<?>[0] : interfaces;
Class<?>[] ancillaryTypes;
if (settings.isSerializable()) {
ancillaryTypes = interfaces == null ? new Class<?>[] {Serializable.class} : new ArrayUtils().concat(interfaces, Serializable.class);
} else {
ancillaryTypes = interfaces == null ? new Class<?>[0] : interfaces;
}

Object spiedInstance = settings.getSpiedInstance(); Object spiedInstance = settings.getSpiedInstance();


T mock = ClassImposterizer.INSTANCE.imposterise(filter, classToMock, ancillaryTypes); T mock = ClassImposterizer.INSTANCE.imposterise(filter, classToMock, ancillaryTypes);
Expand Down
12 changes: 5 additions & 7 deletions test/org/mockito/internal/creation/MockSettingsImplTest.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@
*/ */
package org.mockito.internal.creation; package org.mockito.internal.creation;


import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.io.Serializable;

import org.junit.Test; import org.junit.Test;
import org.mockito.exceptions.base.MockitoException; import org.mockito.exceptions.base.MockitoException;
import org.mockitoutil.TestBase; import org.mockitoutil.TestBase;
import org.fest.assertions.Assertions;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;


public class MockSettingsImplTest extends TestBase { public class MockSettingsImplTest extends TestBase {


Expand Down Expand Up @@ -59,7 +57,7 @@ public void shouldSetMockToBeSerializable() throws Exception {
mockSettingsImpl.serializable(); mockSettingsImpl.serializable();


//then //then
Assertions.assertThat(mockSettingsImpl.getExtraInterfaces()).contains(Serializable.class); assertTrue(mockSettingsImpl.isSerializable());
} }


@Test @Test
Expand Down
32 changes: 32 additions & 0 deletions test/org/mockito/internal/util/ArrayUtilsTest.java
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.mockito.internal.util;

import org.fest.assertions.Assertions;
import org.junit.Test;
import org.mockitoutil.TestBase;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class ArrayUtilsTest extends TestBase {

ArrayUtils utils = new ArrayUtils();

@Test
public void shouldConcatenateItemToAnEmptyArray() throws Exception {
//when
Class<?>[] items = utils.concat(new Class[0], List.class);

//then
Assertions.assertThat(items).containsOnly(List.class);
}

@Test
public void shouldConcatenateItemToFullArray() throws Exception {
//when
Class<?>[] items = utils.concat(new Class[] {Serializable.class, Map.class}, List.class);

//then
Assertions.assertThat(items).containsOnly(Serializable.class, Map.class, List.class);
}
}
11 changes: 11 additions & 0 deletions test/org/mockitousage/basicapi/MocksSerializationTest.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -295,4 +295,15 @@ public void shouldSerializeAlreadySerializableClass() throws Exception {
// then // then
assertEquals("foo", mock.toString()); assertEquals("foo", mock.toString());
} }

@Test
public void shouldBeSerializeAndHaveExtraInterfaces() throws Exception {
//when
IMethods mock = mock(IMethods.class, withSettings().serializable().extraInterfaces(List.class));
IMethods mockTwo = mock(IMethods.class, withSettings().extraInterfaces(List.class).serializable());

//then
serializeAndBack((List) mock);
serializeAndBack((List) mockTwo);
}
} }

0 comments on commit 77cb203

Please sign in to comment.