Category Archives: Java

Java related posts

Groovy and noteworthy

There is a slide deck from my recent talk at JUG UA Aug 8th dedicated to Groovy.

Along with my talk there were additional topics related to Scala and Closure. More details could be found there “JVM-based languages: Scala, Clojure, Groovy” with video and presentations from other speakers. The main idea of this meeting was to demonstrate main concepts of JVM-based languages, what are specials, how to getting started.

It was really fun to have a talk, audience asked a lot of different questions and it was really dynamic and interactive conversation.

Thanks for coming, enjoy a deck and keep coding:)

Again about already known but too useful as always

I got a chance to introduce some convention/design/best practices regarding exception handling in our Java EE/ATG project.

During some research to prove a concept I found some interested articles for me, hope might be useful for someone else.

Some conclusion that I made:

  • do not over-create too many custom exceptions;
  • do not over-use unchecked exceptions, even some too respectful persons are talking that checked exceptions are dead they still might be quite useful
  • pay attention regarding handling/re-throwing
  • do not bubble-up low-level API (wrap API you’re using to not to tie your clients)
  • pay attention to bounded contexts (DDD)
  • and the most hardest one – keep it simple

Thought about build infrustructure

What makes software workable?

In Java world it’s obvious that to make software workable we need to compile it and package into jar file or whatever to be deployed to your container or simply ran as desktop application.

With TDD way to develop software we got understandable necessity to compile and run automatic tests. There are different kind of tests (unit, function, integration etc) and approaches like BDD, but the main idea is to automate testing process of what you written. In terms of build there are additional steps to be done to make software ready to be deployed.

So the conclusion is to make software workable not only in Java we need a build scripts. Often build scripts are written in different language then application one, for example, Ant – XML, Buildr – Ruby, Maven – XML etc. And some times teams argue that they required some person to do the build job. But if we account several points depicted above it’s obious that build scripts are part of developing software we’re writing. And team should care about scripts. Another point to this is the ability to know something new with your build tool, infrastructure, environment configuration stuff and etc.

So let’s do your build job by yourself it’s too important to be left to someone else.

Spring WS difficulties or lack of documentation

В этот раз история будет о неожидонных сложностях, возникшых с одним из замечательных модулей Spring, а именно Spring WS.

На проекте возникла необходимость написания WebService с нуля, было решено использовать Spring и стандартные технологии  в качестве связующей платформы в пользу проприетарных BEA, а теперь уже Oracle принадлежащих решениях. В частности для слоя работы с базой данных мы решили использовать JPA, а в качестве провайдера OpenJPA, до этоо в компании использовалось DSP, честно, первый раз услышал, разбираться не стали. Для WebService стека соответственно Spring WS, вместо чистого JAX WS со связкой через EJB, DAO и BO слои, вы можете сказать, что JAX WS это тоже стандарт, да не могу с вами не согласиться, но Spring WS находится на грани между стандартами и предоставляет гибкость при использовани разных технологий.

В общем после выбора технологий мы принялись за реализацию, и тут нас настигли небольшие трудности… Spring WS навязывает использование подхода – сначала XML потом Java код, это объясняется необхоимостью обеспечения портированности. Это достигается за счет того, что вы продумываете используемые типы данных в WebService и при генерации кода, можно получить не только для языка, с которым вы работаете, но и для любого другого, либо с вашим WebService сможет работать лубой другой клиент, написанный на любом языке.

Так же одной из еще возникших непонятностей, это возвращаемые и принимаемые на вход аргументы и их типы. Как оказалось после дебага в течении итеративных правок кода, сборки, деплоя на WebLogic, и запуском SOATest на запущенном в режиме отладки WebService, было выяснено, что WSDL, предложенный нам архитекторами не совместим с подходом Spring WS. В частности по привычке работы с JAX WS, методы WebService принимали несколько аргументов как примитивных, так и комплексных типов, что так же было присуще и возвращаемым типам данных. По-началу мысли были в стороне приведения типов аргументов и возвращаемых значений к примитивным, но этот фокус не удался. После дальнейшего “дебага” мы наконец-то поняли – Spring WS поддерживает в качестве аргумента только комплексный тип, описанный в XML, при чем аргумент должен быть один. Ну и возвращаемый тип значения тоже должен быть комплексным и описанным в XML. Таким образом если вы возвращаете значение примитивного типа, то вам нужно обвернуть его в комплексный тип и задекларировать в XML (WSDL или XSD).

После приведенных выше правок, наш WebService закрутился на ура, оставалось соглавсовать наши правки в WSDL с архитекторами.

На первый взгляд упомянутые выше ограничения не логичны, но если поразмыслить, то все становится на свои места. Делая обвертки для множества аргументов и примитивных типов возвращаемых значений в виде комплексного типа, мы увеличиваем уровень абстракции и инкапсуляции WebService.

На этом пожалуй мое повествование можно считать завершенным.

Всем удачи и ожидаемых ожиданий 😉

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…