Poster taggade med ‘di’

När ett test skrivs för en klass som har beroenden till en datakälla, en extern service eller bara en annan klass är mockning ofta väldigt användbart. Ibland kan detta leda till att produktionskod anpassas för att det ska gå att skriva dessa tester. Nedan är exempel på ett test som testar en service som använder en entity manager.

package se.cygni.blog;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import javax.persistence.EntityManager;

import org.junit.Before;
import org.junit.Test;

public class BlogServiceTest {

    private BlogService service;
    private EntityManager entityManager;

    @Before
    public void setup() {
        entityManager = mock(EntityManager.class);
        service = new BlogService(entityManager);
    }

    @Test
    public void addEntry() {
        Entry entry = new Entry("title", "text");

        service.addEntry(entry);

        verify(entityManager).persist(entry);
    }

}

Testet i exemplet är relativt enkelt och verifierar endast att persist anropas i addEntry och ger oss följande kod för ett Spring-baserat projekt:

package se.cygni.blog;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class BlogService {

    @PersistenceContext
    private EntityManager entityManager;

    public BlogService() {
    }

    protected BlogService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Transactional
    public void addEntry(Entry entry) {
        entityManager.persist(entry);
    }

}

För att kunna använda en mockad entityManager har vi lagt till en konstruktor som tar en EntityManager som BlogService sedan kan använda. Använder vi dessutom ”field injection” är vi tvugna att lägga till en no-args-konstruktor. Alternativt hade vi kunnat lägga till en setter istället.

    protected void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

Det är väl antagligen inte så illa att behöva lägga till konstruktorer alternativt setters även om det blir värre när en klass har flera beroenden. Däremot känns det ju lite onödigt när både Spring och Java EE numera stödjer field injection. Det går ju att köra enhetstesterna med till exempel Spring och låta Spring injicera alla beroenden. Detta anses dock inte helt lämpligt för enhetstester utan lämpar sig bättre för integrationstester. Istället kan Mockito ta hand om injicering, genom att köra testerna med MockitoJUnitRunner och använda annotationerna @Mock och @InjectMocks. Mockito fungerar då i princip som en enkel IOC-container och några extra konstruktorer eller setters behövs inte.

package se.cygni.blog;

import static org.mockito.Mockito.verify;

import javax.persistence.EntityManager;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class BlogServiceTest {

    @Mock
    private EntityManager entityManager;

    @InjectMocks
    private BlogService service = new BlogService();

    @Test
    public void addEntry() {
        Entry entry = new Entry("title", "text");

        service.addEntry(entry);

        verify(entityManager).persist(entry);
    }
}

Detta inlägg visar hur Dependency Injection (DI) kan användas med hjälp av CDI, Guice och Spring. Depencency Injection beskrivs bland annat i Robert Buréns artikel Spring som DI-ramverk. Exemplet i detta inlägg är kraftigt influerat av en artikel jag läste på DZone.

Spring och Guice är två av de vanligaste ramverken för DI. Dessa ramverk kan användas i standalone-, web- och enterprise-applikationer. CDI är ett standardiserat sätt för DI som kommer med Java EE 6 och kan tills vidare därför endast användas i en enterprise-miljö. Spring erbjuder dock stöd för några av de features som definieras av CDI.

Läs mer >>

Reflektion 2008

2008 kommer gå till historien som ett märkligt år. När det inleddes var det brinnande högkonjunktur och vi hade såklart full beläggning. Nu när det går mot sitt slut är vi inne i vad tidningarna beskriver som den värsta lågkonjunkturen sen 30-talet. Cygni har dock full beläggning ändå vilket känns otroligt skönt. Vi hade ju ett konsultmöte 29 april i år där vi pratade om att lågkonjunktursignalerna blev allt mer tydliga men också om Cygnis strategier för att klara av lite sämre tider. Just beläggningsfokuset, att försöka surfa in i lågkonjunkturen med 100% beläggning, är en viktig del. En annan är vår grundläggande strategi om att vara tydliga i vårt erbjudande till marknaden: ”Vi är bäst i stan på att bygga avancerade javasystem och det kunnandet kan vi applicera i vilken bransch som helst”. Hade någon frågat mig 2006 vilken bransch som skulle få det tuffast närmsta åren skulle jag garanterat ha svarat spelbranschen. Men nu har det istället visat sig att det blev finansbranschen som tagit den största smällen. Poängen med Cygnis branschöverskridande strategi är att det aldrig går att veta vilken bransch eller vilket kundsegment som kommer råka illa ut framöver. Att sprida äggen i olika korgar är en gammal beprövad list som verkligen fungerar i praktiken.

Från den förra lågkonjunkturen kunde man dra lärdomen att trots riktigt dåliga tider så görs det alltid affärer i marknaden. Och det klokaste man kan göra är att redan i högkonjunkturen positionera sig på stora bolag som brukar köpa konsulter även i sämre tider. ICA, Scania, Skandia är bra exempel på sådana kunder. För hur djup och lång den här lågkonjunkturen än blir så finns det garanterat bra uppdrag som räcker till för 25 Cygnikonsulter, det gäller bara att vara aktiva i säljet och göra ett bra jobb i uppdragen vi har.

Den enskilt viktigaste faktorn för Cygnis välmående, den som gör mig övertygad om att vi kommer att klara oss bra igenom den här lågkonjunkturen, det är spetskompetensen hos samtliga Cygnianer. I högkonjunktur kan man få uppdrag om man bara har en ledig kandidat, i lågkonjunktur måste man slåss mot horder av obelagda konkurrenter. Hösten har visat att vi står oss bra i den tuffare konkurrensen då vi har tagit ett flertal nya uppdrag på nya kunder. Johan & Micke fick genomgå hårda urvalstester på Scania, Jonas valdes ut av Skandia bland ett 10-tal offererade konsulter, Veronica blev efter en lång gallringsprocess och intervjuer utvald av Cinnober, Ali blev efter intervju utvald bland en stor mängd konsulter på SmartTrust och Anders blev utvald bland ett stort antal konsulter hos en annan telekomkund. Samtliga dessa uppdrag har alltså vunnits tack vare att Tommy, Robban och jag har nosat upp affärsmöjligheter och sedan, när kunderna gör sitt urval, är ni bättre konsulter än de våra konkurrenter mönstrar. Det finns ingen bättre medicin mot en lågkonjunktur än att vara bättre än sin omgivning!

Under 2008 har vi också haft den stora glädjen att välkomna fem nya kollegor till Cygni: Dennis, Mikael, Emil, Rhoda och Patrik! Emil börjar i och för sig först den 7:e januari då han kliver rakt in i ett jättebra uppdrag på Zenicor redan första dagen.

På kundsidan har ett stort antal nya kunder och även nya branscher tillkommit. Inom media har Nyheter24 och Metro tillkommit. I finanssegmentet är Skandia ny kund och under hösten har vi fått våra två första telekomkunder. På logistikområrdet har Gemalto tillkommit och i november fick vi även Scania på kundlistan. Nästan samtliga dessa företag är stora och har en ledande position på just sin marknad. Ett ganska imponerande facit faktiskt!

På konsultmötessidan inleddes året med ”prova-på-dyk” på Kungsholmen. 20 Cygnianer i full dykutrustning plaskade runt i en liten pool som normalt sett används för babysim. Något man också kunde härleda utifrån mängden oidentiferbara saker som flöt runt i vattnet…

Därefter hade vi ett kontorsmöte då vi snackade utvecklingssamtal och det följdes av en extra stor fredagsöl på kontoret. I mars hade vi sedan ett konferensplaneringskonsultmöte inför resan till Lenzerheide. Själva konferensen blev ju riktigt bra ifrån flera aspekter. 40 cm nysnö den första natten kändes rätt ok. Och hotellet – som marknadsförde sig enligt devisen ”A breath of deluxe is in the air. We have converted the legendary Tic Tac into a stylish party-club. Yes! We are ready for a winter full of good times.” Låg ju också centralt och bra. Om man läser deras slogan och samtidigt försöker härma Arnold Schwarzenegger får man full rolighetseffekt. Vi hann också med att öva oss på övertalning och gruppdynamik med vampyrtouch och träna oss i retorik i självvalda ämnen.

I april besökte vi vinkällaren Grappe och det visade sig att många föredrog fulvinet Chill Out Music framför en Brunello di Montalcino riserva 1999 som kostade 10 gånger så mycket. Hedningar J

29 april körde Emil en bejublad GWT-föreläsning som sedan också upprepades för ICA som valt GWT som klientplattform. 22 maj körde vi takvandring på Riddarholmen och höjdrädslan sköljdes sedan ned med några kalla pilsner i gamla stan. Höghöjdstemat fortsatte på sommarmiddagen då vi åkte RIB ut till Äventyrens Ö för att bestiga, repellera och ”via ferrata” oss upp och ner för berget. Kvällen avslutades med grillning på klipporna och en solnedgång. Romance was in the air.

Hösten inleddes sportigt med Cygnirepresentation i midnattsloppet och några lag i bellmansstafetten där vår stafettgeneral Rebecka fixade ett kanonarrangemang runtomkring också. En riktigt succé som vi såklart ska köra 2009 också. Hösten bjöd också på mer sport i form av en biljardkväll med en trefaldig världsmästare, ett succéseminarium om kvalitet från Tommy och Robban och ett rykte om att vi skulle köra afrikansk dans på något konsultmöte. Julmiddagen har ni ju alla i färskt minne och det kändes som en riktigt bra avslutning på ett riktigt bra år!

Precis som förra året så struntar vi i fysiska julklappar och skickar istället en metafysisk julklapp i form av 500kr per anställd till Ecpat som arbetar mot barnsexhandel och trafficking. Vi kommer dessutom att delta i deras kampanj ”Sveriges 100 schysstaste företag”.

Helgen 5-8 mars åker vi på konferens till Österrike och den lilla alpbyn Kaprun (nära Zell am See).

Avslutningsvis vill jag bara sända ett stort tack till all Cygnianer för ett fantastiskt väl genomfört år och jag önskar er verkligen en riktigt skön och avkopplande jul!

Jon Persson
VD, Cygni AB

EJB 3.0 är den nu gällande versionen av Java Enterprise Beans(EJB) arkitekturen som ingår i Java EE 5. Syftet med EJB 3.0 är att förbättra arkitekturen för EJB och minska komplexiteten för utvecklaren av EJB applikationer. Detta innebär tex följande förbättringar:

  • Annoteringar, det finns ett gäng med annoteringar som man kan använda sig utav för att förenkla arbetet. Dessa annoteringar minskar antalet klasser och interface som man måste skapa och man behöver inte skapa någon deployment descriptor (om man inte vill).
  • Defaulta värden, man skall slippa specifiera en massa vanliga förväntade beteenden och krav från EJB-containern.
  • Inkapsling av beroenden och JNDI åtkomst via annoteringar och dependency injection (DI)
    Businessinterfacet för en sessionsböna kan vara ett vanligt Java-interface, det behöver inte vara av typen EJBObject, EJBLocalObject eller javax.rmi.Remote
  • Home-interfacet behövs inte längre för sessionsbönor.
  • Minskning av krav av användning av checked exceptions
  • En interceptor funktionalitet finns för sessions- och message-driven-bönor.
  • Entitetsbönor har fått en helt egen specifikation, Java Persistence API (JPA), är numera vanliga POJO’s.

Det finns ett par olika typer av EJB:er, sessionsbönor och message-driven-bönor. Sessionsbönorna kommer i två olika smaker, Stateless och Stateful. Entitetsbönorna har ju som sagt ersatts med JPA entiteter. Jag tänkte gå igenom dessa med små korta exempel. Läs mer >>

Detta inlägg ingår i serien Spring från början och kommer att förklara designmönstren Inversion of Control (IoC) och Dependency Injection (DI).

Inversion of Control

Inversion of Control (IoC) är egentligen ett samlingsnamn på en mängd mönster. Dessa mönster uppträder ofta i ramverk. Huvudpoängen är att det inte är den egna applikationskoden som styr programflödet utan att detta sköts av ramverket. IoC är också lite informellt känt som ”Hollywood Principle” – ”don’t call us, We’ll call you.”
Läs mer >>

Vad är en produkt?

Utveckling av mjukvaruprodukter skiljer sig till viss del från traditionell systemutveckling. Detta inlägg belyser några viktiga skillnader mellan systemutveckling och produktutveckling, hur man kan undvika vissa fallgropar genom att arbeta strukturerat och genom att använda rätt typer av verktyg.

Läs mer >>