# Skriva unit tester
Author: Saber

Håller på att börja försöka anvädna unittester när jag kodar program isället för att testa allt för hand. Det fungerar väldigt bra men jag saknar lite funktionalitet i unittesterprogrammet jag använder. Eller så är det snarare att jag inte vet hur jag ska använda det korrect för att testa att det fungerar.

Jag använder just nu JUnit då jag untvecklar i Java, och jag vill försäkra mig att två nycklar jag generar alltid är unika och vill då använda något i form av assertNotEqual men det finns inget utan bara assertEqual. Varför är det så att man bara vill kunna kolla de som är samma inte kunna kolla att de inte är samma?

Vist kan jag ju använda typ assertFalse(key == key) eller något annat primitivt sätt men då är frågan varför finns assatEqual kunde ju lika bra skrivt assertTrue(key==key) då?

## Comment 1
Author: charlie

Först Grattis för ditt val av tekniker!

På jobbet använder vi en anpassad variant av JUnit för att kunna testa en Java VM. Vi saknar dock funktionerna assert\*. Men jag  kan nästan härleda va d de betyder:

assertTrue/False: Evaluear vilkoren precis som en  if-sats skulle, dvs när du agerar på primitva typer  så gör  du en värdejämnförelse 2 == 3 etc. Dock så fungerraar detta inte påå   referenstyper t.ex. så kommer följande program att skriva ut false:

String s1 = new String("ett");  

if (s1 == "ett")

  System.out..println("true");

else

 System.out.println("false");

<EOF>

Därför har man i Java .Equals() för att kunna jämnförraa    referenstyper.

Alltså skulle man egentliiigen  skriva

if (s1.equals("ett))

:)

## Comment 2
Author: charlie

Correction:

Programmet kan    lika gärna skriva ut "true"  som "false"

## Comment 3
Author: Saber

Du har rätt att lika gärna skriva ut true som false. Det är ett stort problem. Tex så fick jag Third true på detta programsnutt.

        String ett = new String("ett");  
        if(ett == "ett"){  
            System.out.println("true");  
        }  
        String ett2 = "ett";  
         
        if(ett == ett2){  
            System.out.println("second true");  
        }  
         
        if(ett2 == "ett"){  
            System.out.println("Third true");  
        }

## Comment 4
Author: charlie

Det är inget problem egentligen, man måste skilja på referenser och värden. Anledningen till att det ibland funkar att använda == för String är att det finns något i java som heter Constant Pool där vissa strängar fördefinieras och kommer att ha samma referens. Därför funkar == vad som händer är att man kollar ifall den ena referensen är samma som den andra alltså ifall de refererar samma objekt på heapen.

Därför \_SKA\_ man använda sig av .equals för att jämnföra strängar. Och det är därför assertEqual() finns.

## Comment 5
Author: Saber

Presis, om man inte vet detta är det ett problem att det fungerar ibland! ;)

## Comment 6
Author: Erik

Antar att det är därför "Effective Java" säljer så bra? =P

Ang. assertNotEquals() så borde du överväga att skapa din egen basklass för dina testfall, så att du använder säg MyTestCase (extends TestCase) istället för TestCase. Då har du möjligheten att enkelt lägga till funktioner som du har användning för i dina tester.
