[
http://jira.codehaus.org/browse/JMOCK-201?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=171198#action_171198 ]
Corporate Gadfly commented on JMOCK-201:
----------------------------------------
Hi Nat,
I needed to override the methods canImposterise() and imposterise().
Here is my canImposterise() method:
{code:title=Mine}
public boolean canImposterise(Class<?> type) {
return !type.isPrimitive() &&
!Modifier.isFinal(type.getModifiers()) &&
type.isInterface();
}
{code}
as compared to the original:
{code:title=Original}
public boolean canImposterise(Class<?> type) {
return !type.isPrimitive() &&
!Modifier.isFinal(type.getModifiers()) &&
(type.isInterface() || !toStringMethodIsFinal(type));
}
{code}
Notice the extra call to toStringMethodIsFinal. So overriding this one is easy.
When I tried to override the imposterise() method, it had calls to private methods. Here's mine:
{code:title=Mine}
public <T> T imposterise(final Invokable mockObject, Class<T> mockedType, Class<?>... ancilliaryTypes) {
try {
setConstructorsAccessible(mockedType, true);
Class<?> proxyClass = createProxyClass(mockedType, ancilliaryTypes);
return mockedType.cast(createProxy(proxyClass, mockObject));
}
finally {
setConstructorsAccessible(mockedType, false);
}
}
{code}
compared to original:
{code:title=Original}
public <T> T imposterise(final Invokable mockObject, Class<T> mockedType, Class<?>... ancilliaryTypes) {
if (!mockedType.isInterface() && toStringMethodIsFinal(mockedType)) {
throw new IllegalArgumentException(mockedType.getName() + " has a final toString method");
}
try {
setConstructorsAccessible(mockedType, true);
Class<?> proxyClass = createProxyClass(mockedType, ancilliaryTypes);
return mockedType.cast(createProxy(proxyClass, mockObject));
}
finally {
setConstructorsAccessible(mockedType, false);
}
}
{code}
Overriding this one was a little bit more difficult as it has calls to 3 private methods (createProxyClass, createProxy, setConstructorsAccessible).
Hope the situation is a little bit clearer.
> Allow ClassImposteriser to be extended
> --------------------------------------
>
> Key: JMOCK-201
> URL:
http://jira.codehaus.org/browse/JMOCK-201> Project: jMock
> Issue Type: Improvement
> Components: Library
> Affects Versions: 2.5.1
> Reporter: Corporate Gadfly
> Attachments: JMOCK-201.patch
>
>
> I had a need to imposterise concrete classes (from 3rd-party jars) with final toString() method.
> For background, please see discussion at:
>
http://www.nabble.com/Re%3A-mocking-concrete-classes-with-final-toString-method-p18509146.html> In that thread, Nat had advised one of the options as being "write your own Imposteriser".
> So, for my needs I ended up writing ClassImposteriserAllowingFinalToString. It would be great if ClassImposteriser could be made easier to extend. As it is, it has a lot of private methods and properties and I pretty much had to rewrite my own imposteriser from scratch (essentially duplicating the private pieces of ClassImposteriser). If ClassImposteriser was extension friendly, I would probably need to do minimal work by writing my own imposterise() and canImposterise() methods. This way I would also be safeguarded against future bug-fixes that may happen in ClassImposteriser.
> Cheers and thanks in advance.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email