Tag Archives: testing

powermock – real power for testing untestable stuff

Last weekend was spent to make my Chrome extension base on GWT working with content scripts written using GWT. As one of main concept is to keep my trust for my code on appropriate level. To achieve this I’m practicing in TDD. For testing purposes I use JUnit 4.x and for mocking Mockito.

I’d like to spend some thime on MockitoMockito is really powerful mocking framework with sweat features, all ones you can find here http://code.google.com/p/mockito/wiki/FeaturesAndMotivations. As for me I really like nice and laconic syntax ans simplicity.

The information above is not a main reason of this post, the main one is to tell about my experience to test code using GWT classes e.g. finals and statics. After some time spent to google something will be helpful I’v found out PowerMock. This framework provides abilities to mock static classes and final methods and as you might know GWT uses a lot of such stuff.

For example I need to test method which handles browser page’ events from content script and pass related data to background page to process those data. The issue was to assign event for whole page, this is impossible as RootPanel.get() does not support event handlers. So I’ve found out another way – use Event.addNativePreviewHandler and NativePreviewHandler to hande events.

So I created implementation of NativePreviewHandler and started from test. Logic is quite simple but I was unable to use GWT code in my POJT (Plain Old Java Test), as NativeEvent returned by NativePreviewEvent as an argument for method NativePreviewHandler.onPreviewNativeEvent requires GWT.create method call, which in turn need a GWT context to be set up. But this is not what I want.  I’d like to have simple and fast tests without necessity to compile Java to JavaScript and only after to test.

In this situation I need mock GWT classes to be able to test my code, but Mockito does not support mocking for static classes and final methods. So PowerMock solved my trouble. Example of usage:

@RunWith(PowerMockRunner.class)
@PrepareOnlyThisForTest({ NativeEvent.class, SelectionProvider.class })
@SuppressStaticInitializationFor({ "com.google.gwt.dom.client.NativeEvent" })
public class ContentScriptEventHandlerTest {
 
        @Mock
	private ChromePort port;
 
        // Creates mock for class with final methods
	private NativeEvent event = PowerMockito.mock(NativeEvent.class);
 
	@Before
	public void setUp() throws Exception {
		MockitoAnnotations.initMocks(this);
                // Creates mock for static class
		PowerMockito.mockStatic(SelectionProvider.class);
                // assign return value for method from static class
		PowerMockito.when(SelectionProvider.getSelection()).thenReturn("word");
                // there was stackoverflow and we do not need to call for equals
		PowerMockito.suppress(event.getClass().getMethod("equals", Object.class));
                // assign return values for final methods
		PowerMockito.doReturn("mouseup").when(event).getType();
		PowerMockito.doReturn(true).when(event).getCtrlKey();
		PowerMockito.doReturn(true).when(event).getAltKey();
	}
 
	@Test
	public void shouldNotConsumeNotMouseupEvent() throws Exception {
		ContentScriptEventHandler eventHandler = new ContentScriptEventHandler(port);
		NativePreviewEvent previewEvent = mock(NativePreviewEvent.class);
		PowerMockito.doReturn("notamouseevent").when(event).getType();
		when(previewEvent.getNativeEvent()).thenReturn(event);
 
		eventHandler.onPreviewNativeEvent(previewEvent);
		verify(previewEvent, never()).consume();
	}
}

That’s it. Have enjoy testing…

Test multipart request in Grails

Прошло относительно немного времени с момента последнего поста и я уже нахожусь на родине :). Вторую часть повествования моего пребывания заграницей я продолжу в следующий раз, а сегодня хочу поделиться одним незатейливым решением одной небольшой проблемы.

И так, немного вводной информации – на данный момент происходит мое знакомство с Grails методом написания демо-проекта. И в одной из задач проекта была реализация возможности загружать файлы, а именно изображения на сервер. Сам процесс загрузки собственно не сложен, а как и все в Grails, очень прост. Возможность загрузки файлов обеспечивается с помошью установки аттрибута формы enctype в виде:

<g:form action="save" enctype="multipart/form-data">
...
</g:form>

Либо следующим образом, разница только в том, что enctype уже “multipart/form-data”

<g:uploadForm action="save">
...
</g:uploadForm >

А в котроллере файл можно получить следующим образом:

def multipartFile = request.getFile('file')

где “file” – имя параметра из запроса, далее с этим объектом можно работать как со стандартным http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/multipart/MultipartFile.html.

Но собственно вернемся к проблеме, которая заключается в тест ировании загрузки файла на сервер. Как оказалось моковый объект запроса в контроллере не поддерживает multipart запросы.

К счастью, Groovy распологает возможностью динамически расширять возможности объекта в режиме выполнения. Это обеспечивается с помошью Mixin. Таким образом с помошью следующей конструкции я могу расширить возможности стандартного мокового объекта запроса:

....
def controller = new SomeController()
def imageMultipartFile = new MockMultipartFile("file", "test_image.jpg", "image/jpg", file.readBytes())
//add multipart nature to the mock request
controller.request.metaClass.mixin MockMultipartHttpServletRequest
controller.request.addFile(imageMultipartFile)
....

Собственно на этом все, проблема с невозможностью протестировать загрузку файла решена. Спасибо за внимание и удачного тестирования.