Avatar billede frankjohansen Nybegynder
14. april 2007 - 13:30 Der er 30 kommentarer

unit testing i BlueJ

hej

Hvad er der galt i denne test-metode? Der kommer failure når jeg tester

public void testAddappointments()
{
java.util.GregorianCalendar gregoria1 = new java.util.GregorianCalendar(2007, 4, 11, 12, 00);

java.util.GregorianCalendar gregoria2 = new java.util.GregorianCalendar(2007, 4, 11, 16, 00);

model.AppointmentClass appointm1 = new model.AppointmentClass("møde", gregoria1, gregoria2);

model.DayClass dayClass1 = new model.DayClass(gregoria1);
dayClass1.addAppointment(appointm1);
assertEquals(appointm1, dayClass1.getAppointments());
}
Avatar billede _carsten Nybegynder
14. april 2007 - 14:08 #1
Kender ikke BlueJ, men lad os se en udskrift af fejlen
Avatar billede frankjohansen Nybegynder
14. april 2007 - 14:17 #2
det er åbenbart i sidste linje den brokker sig:

den skriver:
expected:<From 2/3 2006 10:0, To: 2/3 2006 2:0, Text: skole> but was:expected:<[From 2/3 2006 10:0, To: 2/3 2006 2:0, Text: skole]>

selve koden kan godt compile, men der er stadig noget galt
Avatar billede erikjacobsen Ekspert
14. april 2007 - 14:20 #3
Har din DayClass en equals og hashcode metode ?
Avatar billede _carsten Nybegynder
14. april 2007 - 14:24 #4
Jeg kan vist ikke hjælpe dig, troede BlueJ generede et fornuftigt stack trace som man kunne læse noget ud af - sorry :(

Prøv dog at gå din metode assertEquals() efter i sømmene og din dayClass1.getAppointments().

Returnerer dayClass1.getAppointments() et object eller null og kan assertEquals() håndtere null.
Avatar billede frankjohansen Nybegynder
14. april 2007 - 14:28 #5
Her er Day-klassen 

    public DayClass(Calendar newDate)
    {
        date = newDate;
        appointments = new ArrayList<Appointment>();
    }
   
    public List<Appointment> getAppointments()
    {
        return appointments;
    }

    public void addAppointment(Appointment entry)
    {
      appointments.add(entry);
    }


    public void removeAppointment(Appointment entry)
    {
      appointments.remove(entry); 
    }
}
Avatar billede _carsten Nybegynder
14. april 2007 - 14:30 #6
Hvor adder din date ???

    public DayClass(Calendar newDate)
    {
        date = newDate; // HVAD SKAL DER SKE MED date
        appointments = new ArrayList<Appointment>();
    }
Avatar billede erikjacobsen Ekspert
14. april 2007 - 14:31 #7
Og du skal en equals og en hashcode metode for at kunne sammenligne to objekter fra klassen. Så skal det nok komme til at virke ;)
Avatar billede _carsten Nybegynder
14. april 2007 - 14:32 #8
Skal den ikke se sådan ud ?

    public DayClass(Calendar newDate)
    {
        date = newDate; // HVAD SKAL DER SKE MED date
        appointments = new ArrayList<Appointment>();
        appointments.add( new Appointment(date)); // ELLER LIGNENDE
    }

ellers vil denne returnerer en tom List

    public List<Appointment> getAppointments()
    {
        return appointments;
    }
Avatar billede frankjohansen Nybegynder
14. april 2007 - 15:03 #9
det der er galt er at i denne linje sammelignes en list af appointments med én appointment.

assertEquals(appointm1, dayClass1.getAppointments());

forstår det stadig ikke helt
Avatar billede erikjacobsen Ekspert
14. april 2007 - 15:06 #10
Du vil slet ikke forholde dig til det jeg skriver??
Avatar billede frankjohansen Nybegynder
14. april 2007 - 15:07 #11
forklar det lige så jeg kan forstå det
Avatar billede erikjacobsen Ekspert
14. april 2007 - 15:11 #12
Må jeg gætte på du er ved at lære Java og objektorienteret programmering? Gå tilbage til din lærebog eller lærer og find ud af hvordan man laver helt færdige klasser, nemlig med en equals-metode og en hashcode-metode, så du kan sammenligne objekter.
Avatar billede arne_v Ekspert
14. april 2007 - 15:16 #13
erik>

du har ret i at equals og hashCode nok vil vaere godt at faa overriden

men i det konkrete tilfaelde hvor man sammenligner original med noget som lige er
puttet ind i en List og hentet ud igen, saa boer Object's metoder faktisk ogsaa
returnere ens

som skrevet 15:03:04 er problemet at

assertEquals(appointm1, dayClass1.getAppointments());

sammenligner en AppointmentClass med en ArrayList<Appointment>
Avatar billede arne_v Ekspert
14. april 2007 - 15:16 #14
proev om ikke

assertEquals(appointm1, dayClass1.getAppointments().get(0));

returnerer true
Avatar billede erikjacobsen Ekspert
14. april 2007 - 15:27 #15
Ha ha, ja, jeg var ikke kommet så langt som til at se hvad der faktisk blev sammenlignet.
Avatar billede _carsten Nybegynder
14. april 2007 - 15:30 #16
Din DayClass constructor behøver ikke have en parameter, da du ikke bruger den til noget

Da du bruger dayClass1.addAppointment(appointm1) (hvilket jeg ikke så i første omgang) vil din getAppointments() returnere en List med ét element == det giver ikke anledning til fejl

Fejlen ligger i assertEquals() eller AppointmentClass, hvor du som erik skriver, må have en equals metode, som gennemløber din List og sammenligner objecter af typen AppointmentClass
Avatar billede _carsten Nybegynder
14. april 2007 - 15:35 #17
Er jeg den eneste som ikke mails når et spørgsmål er kommenteret ??
Avatar billede arne_v Ekspert
14. april 2007 - 15:36 #18
nej - mail er nede

se http://www.eksperten.dk/spm/773225
Avatar billede _carsten Nybegynder
14. april 2007 - 15:41 #19
OK - så må jeg jo bruge F5, når jeg en gang i mellem kommer forbi maskinen :)
Avatar billede frankjohansen Nybegynder
14. april 2007 - 17:21 #20
Når man så skal lave en removeappointment, så skal man så sammenligne
en tom liste med hvad??
Avatar billede frankjohansen Nybegynder
14. april 2007 - 18:01 #21
Desuden skal jeg have lavet en getAppointments, men bliver den ikke det samme som addappointment? Man skal vel adde en appointment til listen før man udfører get-metoden.
Avatar billede erikjacobsen Ekspert
14. april 2007 - 21:51 #22
Hvis du udfører en get uden der er noget i listen, kan du enten aflevere en null-værdi eller kaste en Exception - afhænger af hvordan du bruger den.
Avatar billede frankjohansen Nybegynder
14. april 2007 - 22:16 #23
hmmm...skal det så stadig være assertEquals

Har prøvet denne, men funker ikke
assertEquals(null, dayClass1.getAppointments());
Avatar billede erikjacobsen Ekspert
14. april 2007 - 22:22 #24
Der er også en assertNull - selv om din også virker
Avatar billede frankjohansen Nybegynder
14. april 2007 - 22:26 #25
jeg får 'no exception message' hvis jeg bruger denne:

assertNull(null, dayClass1.getAppointments());
Avatar billede erikjacobsen Ekspert
14. april 2007 - 23:24 #26
Du skal kun tage een parameter (eller 2, hvis den første er en string/besked, der skal skrives ud ved fejl). Du kigger vel på noget i retning af: http://junit.sourceforge.net/javadoc/junit/framework/Assert.html ?
Avatar billede frankjohansen Nybegynder
15. april 2007 - 09:32 #27
jeg skal skrive:

assertEquals(dayClass1.getAppointments());

men der hvor der står object anden gang i nedenstående linje, hvad betyder det?
Er det det der skal stå inde i parantesen i getAppointments(her)

assertNull(java.lang.Object object)
Avatar billede erikjacobsen Ekspert
15. april 2007 - 09:41 #28
Du har før brugt assertEquals med to parametre, så de mener vist ikke det du skriver?

Hvis jeg husker rigtigt kan man få en besked skrevet ud:  assertNull("Bananen er null, og det sku' den ikke være",bananen);
Avatar billede frankjohansen Nybegynder
15. april 2007 - 13:03 #29
hvis man nu skal lave en getAppointments, så har man en liste (dayClass1.getAppointments()) som skal sammenlignes med en liste
men hvordan gør man det?

assertEquals(???, dayClass1.getAppointments());
Avatar billede erikjacobsen Ekspert
15. april 2007 - 14:30 #30
Så skal du lave en liste, du kan sammenligne med, og huske en passende equals og hashCode i din klasse. Eller du sammenligner selv element for element.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester