Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java/Seam] Conditionele mocking in Jboss seam

Pagina: 1
Acties:

  • _Erikje_
  • Registratie: Januari 2005
  • Laatst online: 18-11 21:57

_Erikje_

Tweaker in Spanje

Topicstarter
Met Jboss seam heb ik een webapplicatie gebouwd welke ik nu aan het testen ben.
Nu gebruik ik de mocking functionaliteit van seam om een object te mocken. Dit gebruik ik in een test wat naar mijn mening wel goed gaat.

Nu wil ik in een andere test de functionaliteit van het gemockte object gaan testen Ik wil dus een instantie van het echte object ipv de mock.

Nu heb ik de volgende code geschreven

De interface
Java:
1
2
3
public interface IMyClass{
    public bar();
}

De normale implementatie
Java:
1
2
3
4
5
6
@Name("myClassName")
public class MyClass implements IMyclass{
    public bar(){
        System.out.println("Using the real class");
    }
}


En de mock
Java:
1
2
3
4
5
6
7
@Name("myClassName")
@Install(precedence=Install.MOCK)
public class MyClassMock implements IMyclass{
    public bar(){
        System.out.println("MOCKING");
    }
}


Nu maak ik een instantie van mijn klasse gebruikmakend van de reguliere seam manier:
Java:
1
MyClass myClass = (MyClass) Component.getInstance("myClassName");

Nu krijg ik bij mijn tests mijn mock object terug terwijl ik eigenlijk mijn normale object wil krijgen.

Hoe kan ik er voor zorgen dat ik mijn mock even links leg zonder de klasse weg te gooien?

(btw het seam forum kan me niet helpen omdat de topic post applicatie steeds op zijn plaat gaat)

[ Voor 4% gewijzigd door _Erikje_ op 17-03-2008 14:21 ]


  • smeaggie
  • Registratie: Juli 2004
  • Niet online
Seam gebruikt het component met de hoogste precedence waarde. De default waarde is APPLICATION. De precedence MOCK is hoger (de hoogste), dus krijg je die altijd terug.

lees voor de zekerheid dit stukje documentatie.
Daar staat het op volgorde in :)

(dit is uit de seam 2.1 documentatie, maar het werkte in versie 1.2 op precies dezelfde manier)

[ Voor 14% gewijzigd door smeaggie op 17-03-2008 17:41 ]


  • _Erikje_
  • Registratie: Januari 2005
  • Laatst online: 18-11 21:57

_Erikje_

Tweaker in Spanje

Topicstarter
Er is dus geen mooie manier om dit op te lossen...

De vraag dan is:
Is er een methode om die precedence van mijn mock klasse/object te verlagen in mijn test?

  • smeaggie
  • Registratie: Juli 2004
  • Niet online
tsja, als je je mock object een precedence built-in of framework geeft pakt hij natuurlijk je echte object op, die heeft immers application precedence. Lijkt me niet de beste methode omdat je dan toch altijd in java code blijft aanpassen als je een mock meer of minder wilt gebruiken.

De beste manier is denk ik om met de buildscripts te knoeien. Verschillende build targets maken die bepaalde mock objecten meenemen in de build of niet, waardoor je verschillende dingen aan of uit kunt zetten zonder de java code te veranderen.

  • _Erikje_
  • Registratie: Januari 2005
  • Laatst online: 18-11 21:57

_Erikje_

Tweaker in Spanje

Topicstarter
Ja, daar was ik ook al naar aan het kijken. Een boom voor mijn unittesting (waar ik lekker wil mocken) en een boom voor mijn integratietesting.

Bedankt voor het meedenken!