Hi,

some of our code uses the GWT History class (specifically the 
#encodeHistoryToken() method), and while trying to write tests for that 
code I found that GwtMockito doesn't provide a specific fake for History 
(fair enough), but unfortunately also that providing one is quite hard: 
History delegates the encoding to an instance of HistoryImpl, but that one 
is private, and so the straight-forward way of creating and registering a 
fake doesn't work.

My work-around for this is to use reflection to make the class accessible 
enough, and that works reasonably well. But, the work-around is ugly, so I 
was wondering: is there any specific reason not to make HistoryImpl 
accessible?

Regards,
--
Andreas

PS: If it helps anyone in the same position, here's the code I'm using. 
This uses easymock for various reasons, using mockito should work as well:
// Prepare the private HistoryImpl class for mocking
Class<?> historyImplClass = Class.forName(
"com.google.gwt.user.client.History$HistoryImpl");
Method encodeHistoryTokenMethod = historyImplClass.getMethod(
"encodeHistoryToken", String.class);
encodeHistoryTokenMethod.setAccessible(true);

// Create the mock itself
Object historyImpl = createNiceMock(historyImplClass);

// Mock #encodeHistoryToken()
encodeHistoryTokenMethod.invoke(historyImpl, isA(String.class));
expectLastCall().andAnswer(new IAnswer<String>() {
    @Override
    public String answer() throws Throwable {
        String value = (String) getCurrentArguments()[0];        
        if (value == null) {
            throw new NullPointerException();
        } else if (value.isEmpty()) {
            return "";
        }
        
        try {
            URI uri = new URI(null, null, value);
            // URI#getRawFragment() is pretty close, but it does 
unfortunately retain characters >= U+0080,
            // which we do not want.
            // Instead, rely on #toASCIIString(), and cut away the '#' in 
the beginning.
            // See also HistoryImpl#encodeHistoryToken()
            String encoded = uri.toASCIIString();
            assert encoded.charAt(0) == '#' : "Sanity";
            return encoded.substring(1).replace("#", "%23");
        } catch (URISyntaxException e) {
            throw new IllegalArgumentException("Cannot use '" + value + "' 
as fragment", e);
        }
    }
}).anyTimes();
replay(historyImpl);

// Finally, tell GwtMockito about it.
GwtMockito.useProviderForType(historyImplClass, new FakeProvider<Object>() {
    @Override
    public Object getFake(Class<?> type) {
        return historyImpl;
    }
});



-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-web-toolkit+unsubscr...@googlegroups.com.
To post to this group, send email to google-web-toolkit@googlegroups.com.
Visit this group at http://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.

Reply via email to