UML Diagramm

Diskutiere UML Diagramm im Java Basics - Anfänger-Themen Bereich.
S

Snaer

Guten Tag,

Ich soll als Aufgabe dieses UML Diagramm in einen Code umsetzen.
Eigentlich dachte ich fertig zu sein jedoch bekomme ich folgende Fehlermeldung:

There was 1 failure:
1) test(PublicTests)
java.lang.AssertionError: expected:<2> but was:<0>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:631)


Mein Code sieht so aus :
Code:
import java.util.Date;

public class Gemaelde extends Kunstwerk implements Restaurierbar {
public Gemaelde(Kunstmuseum museum) {
        super(museum);
        // TODO Auto-generated constructor stub
    }

private Date zuletztRestauriertAm;

public void restaurieren() {
    
}

public Date getZuletztRestauriertAm() {
    return zuletztRestauriertAm;
}

public void setZuletztRestauriertAm(Date zuletztRestauriertAm) {
    this.zuletztRestauriertAm = zuletztRestauriertAm;
}
}

import java.util.ArrayList;


public class Kunstmuseum {
private ArrayList<Kunstwerk> werke = new ArrayList<Kunstwerk>();
private String name;

public ArrayList<Kunstwerk> getWerke(){
    return werke;
}
public void setWerke(ArrayList<Kunstwerk> werke) {
    this.werke=werke;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}


}


public abstract class Kunstwerk {
    private String name;
    private double preis;
    private Person besitzer;
    private Kunstmuseum museum;
    
    public Kunstmuseum getMuseum () {
        return this.museum;
    }
    public void setMuseum (Kunstmuseum museum) {
        this.museum=museum;
    }
    
    public Kunstwerk(Kunstmuseum museum) {
        if (museum == null) {
            throw new IllegalArgumentException();
        }
        this.setMuseum(museum);
    }
    
    public Person getBesitzer () {
        return besitzer;
    }
    
    public void setBesitzer (Person besitzer) {
        this.besitzer = besitzer;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPreis() {
        return preis;
    }
    public void setPreis(double preis) {
        this.preis = preis;
    }

}
Das Problem ist, dass ich mir nichts genaueres unter dem Fehler vorstellen kann. Meine Vermutung ist bislang das es an Gemaelde und Statue liegt.
Für eine Erläuterung des Fehlers und Hinweise zur Lösung wäre ich sehr dankbar!
 

Anhänge

J

JustNobody

Vermutlich hat der Test zwei Kunstwerke für ein Museum erzeugt und dann die Anzahl an Kunstwerken im Museum geprüft.

Nun kannst Du mal schauen, wieso die Anzahl an Kunstwerken 0 ist, wenn da doch zwei Kunstwerke erzeugt wurden.

Ansonsten wäre es sehr gut, wenn wir die Tests auch sehen könnten um zu sehen, was schief gelaufen ist. Das würde es deutlich vereinfachen...
 
L

LimDul

Hilfreich wäre es den Fehlerhaften Testfall auch zu ergänzen :)
 
S

Snaer

Mein Fehler ich vergaß dachte ich hätte an den Test gedacht.

Code:
import static org.junit.Assert.*;

import java.util.Date;

import org.junit.Test;

public class PublicTests {

    @Test
    public void test() {
        Kunstmuseum kunstmuseum = new Kunstmuseum();
        kunstmuseum.setName("Koblenzer Kunstmuseum");
        assertEquals("Koblenzer Kunstmuseum", kunstmuseum.getName());
        assertNotNull(kunstmuseum.getWerke());
        assertEquals(0, kunstmuseum.getWerke().size());
        
        Kunstwerk kunstwerk1 = new Statue(kunstmuseum);
        Kunstwerk kunstwerk2 = new Gemaelde(kunstmuseum);
        assertEquals(kunstmuseum, kunstwerk1.getMuseum());
        assertEquals(kunstmuseum, kunstwerk2.getMuseum());
        
        assertEquals(2, kunstmuseum.getWerke().size());
        
        kunstwerk1.setName("Werk1");
        kunstwerk1.setPreis(499.99);
        kunstwerk2.setName("Werk2");
        kunstwerk2.setPreis(349.99);
        assertEquals("Werk1", kunstwerk1.getName());
        assertEquals(499.99, kunstwerk1.getPreis(),1E-4);
        
        ((Statue)kunstwerk1).setHoehe(300);
        assertEquals(300,((Statue)kunstwerk1).getHoehe());
        
        Date date = new Date();
        ((Gemaelde)kunstwerk2).setZuletztRestauriertAm(date);
        assertEquals(date, ((Gemaelde)kunstwerk2).getZuletztRestauriertAm());
        assertTrue(kunstwerk2 instanceof Restaurierbar);
        ((Restaurierbar)kunstwerk2).restaurieren();
        
        Person person1 = new Person(kunstwerk1);
        assertEquals(person1, kunstwerk1.getBesitzer());
        person1.setName("Person1");
        assertEquals("Person1",person1.getName());
        assertEquals(1,person1.getKunstwerke().size());
        assertTrue(person1.getKunstwerke().contains(kunstwerk1));
    }

}
Der Test erzeugt in der Tat 2 Kunstwerke, jedoch verstehe ich nicht wieso das Ergebnis 0 sein soll.
Habe ich es richtig verstanden, dass assertEquals überprüft ob die beiden gleich sind?
 
J

JustNobody

Das Ergebnis soll nicht 0 sondern 2 sein. Der Test besagt ja:
assertEquals(2, kunstmuseum.getWerke().size());

Also 2 ist der Soll Wert und er fragt vom kunstmuseum getWerke().size() ab.

Und beim Ausführen meckert er, denn es soll 2 sein, aber es ist 0.

Und der Code, der ausgeführt wird, ist ja:
Java:
        Kunstwerk kunstwerk1 = new Statue(kunstmuseum);
        Kunstwerk kunstwerk2 = new Gemaelde(kunstmuseum);
==> Schau dir jetzt einfach den Konstruktor an. Was passiert da? Wird da das übergebene Museum irgendwo angepackt?
 
S

Snaer

Meine Aussage kam falsch rüber, ich meinte, weswegen es bei meinem Code 0 wird ^^.

An sich übergebe ich ja das museum in Statue und Gemaelde weiter bei
Code:
public Gemaelde(Kunstmuseum museum) {
        super(museum);
        // TODO Auto-generated constructor stub
    }
zum Beispiel.
Verstehe ich es richtig, dass ich das ich in dem Konstruktor dann noch etwas ändern muss bzw die Größe übergeben soll?
Bzw dass das Problem daran liegt, dass ich das museum zwar übergebe es jedoch nicht benutze?
 
J

JustNobody

Ja genau. Derzeit speicherst Du das Museum ja nur in deinem Kunstwerk. Dadurch kennt das Museum aber das Kunstwerk nicht. Somit musst Du mal schauen, wie Du ein Kunstwerk in einem Museum bekannt machen kannst.
 
S

Snaer

Okay danke für den Tipp!
Das werde ich morgen dann direkt mal ausprobieren mein Ansatz wäre es in Musuem ein Kunstwerk zu erstellen
Sprich private Kunstwerk kunstwerk;
 
J

JustNobody

Okay danke für den Tipp!
Das werde ich morgen dann direkt mal ausprobieren mein Ansatz wäre es in Musuem ein Kunstwerk zu erstellen
Sprich private Kunstwerk kunstwerk;
Du hast da doch schon eine Liste mit Kunstwerken:
private ArrayList<Kunstwerk> werke = new ArrayList<Kunstwerk>();
 
S

Snaer

Stimmt mein Fehler.
Mein Ansatz sieht nun so aus, leider kann ich diesen im Moment nicht testen, da die Seite nicht erreichbar ist.
Code:
import java.util.ArrayList;
import java.util.List;


public class Kunstmuseum {
private List<Kunstwerk> werke;
private String name;

 
public Kunstmuseum(String name) {
    this.werke= new ArrayList<Kunstwerk>();
    this.name=name;
}

public void addWerk (Kunstwerk werk) {
    this.werke.add(werk);
}
public void removeWerk(Kunstwerk werk) {
    this.werke.remove(werk);
}

public List<Kunstwerk> getWerke(){
    return this.werke;
}

public void setWerke(List<Kunstwerk> werke) {
    this.werke=werke;
}


public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
Ich habe mich viel dabei an einer Beispiel Folie orientiert, meine Intention dahinter war es die Kunstwerke auf die Liste überhaupt erst zu übertragen, da sie wenn ich es richtig verstanden hatte bis zum letzen Zeitpunkt zwar existierte jedoch noch leer war.
Bin ich damit zumindest auf den richtigen Weg oder denke ich völlig in die falsche Richtung?
 
J

JustNobody

Also das ist eine Änderung, die alleine nichts macht. Du hast neue Methoden, aber denn die nicht aufgerufen werden, dann bewirken sie nichts.

Manche IDEs zeigen das auch etwas an - meine IDE (IntelliJ) zeigt so Methoden grau an, da diese aus Sicht der IDE nicht benutzt werden.

Und da du an die werke ja schon über getWerke() heran gekommen bist, waren diese Methoden nicht notwendig (Wobei mir diese besser gefallen als Getter/Setter auf werke).

Du solltest also noch etwas anpassen so dass z.B. nach der folgenden Zeile Code:
Java:
Kunstwerk kunstwerk1 = new Statue(kunstmuseum);
die Statue auch in werke von kunstmuseum ist. Was wird da aufgerufen? An welchen Stellen könntest Du da etwas machen?
 
S

Snaer

Ich gehe davon aus, dass das Problem in der Klasse Kunstmuseum liegt, da du sagst, dass ich dafür sorgen muss das die Werke auch dort sind.
So wie ich es verstehe, korrigiere mich gerne wenn ich falsch liege, wird ein neues Kunstwerk Objekt erzeugt.
Würde es helfen eine Statue kunstmuseum in der Klasse zu intialisieren, damit die Klasse eben diese kennt oder ist das bei weitem zu einfach gedacht?
 
T

temi

Ich gehe davon aus, dass das Problem in der Klasse Kunstmuseum liegt, da du sagst, dass ich dafür sorgen muss das die Werke auch dort sind.
Nein, Kunstmuseum hat ja eine sehr praktische Methode addWerk(), die du verwenden kannst.

So wie ich es verstehe, korrigiere mich gerne wenn ich falsch liege, wird ein neues Kunstwerk Objekt erzeugt.
Genau und diesem Kunstwerk wird ein Kunstmuseum mitgegeben (im Konstruktor). Mit dem Kunstmuseum kannst du doch was machen! **Wink mit dem Zaunpfahl**


Würde es helfen eine Statue kunstmuseum in der Klasse zu intialisieren, damit die Klasse eben diese kennt oder ist das bei weitem zu einfach gedacht?
Das verstehe ich nicht, was du da vorhast...
 
S

Snaer

Tut mir Leid wenn ich einen offensichtlichen Hinweis missinterpretiere :rolleyes:
Aber muss ich vielleicht dann in der Klasse Kunstwerk mittels Konstruktor den Namen des Museums mitgeben? Da dies ja der einzige Parameter in der Klasse Kunstmuseum ist und ich es so eventuell zu einem erzeugten Museum zuweisen kann.
 
T

temi

Schau dir doch mal den Test an:
Java:
        Kunstwerk kunstwerk1 = new Statue(kunstmuseum);
        Kunstwerk kunstwerk2 = new Gemaelde(kunstmuseum);
Da werden zwei Kunstwerke erzeugt und die bekommen "ihr" Kunstmuseum im Konstruktor mitgegeben.

Ein Kunstwerk kann sich durchaus auch selbst "seinem" Museum hinzufügen: kunstmuseum.addKunstwerk(this);
 
S

Snaer

Mir fällt auf, dass ich in meinen Klassen Statue und Gemaelde ein "museum" im Konstruktor mitgebe anstelle eines kunstmuseum.
Ist das ein Fehler der mir Probleme bereitet?

Ansonsten stehe ich leider gerade echt auf dem Schlauch was ich mit dem besagten kunstmuseum, welches bei der Initialisierung im Test mitgegeben wird, tun kann.
 
T

temi

Mir fällt auf, dass ich in meinen Klassen Statue und Gemaelde ein "museum" im Konstruktor mitgebe anstelle eines kunstmuseum.
Meinst du damit z.B. dieses?
Java:
public Gemaelde(Kunstmuseum museum) {
        super(museum);
        // TODO Auto-generated constructor stub
    }
Das ist ja nur der Name des Parameters. Der Parameter ist vom Typ Kunstmuseum und heißt museum. Den Namen kannst du frei wählen, z.B.

Java:
public Gemaelde(Kunstmuseum kleinesWeissesKaninchen) {
        super(kleinesWeissesKaninchen);
        // TODO Auto-generated constructor stub
    }
Das ändert nichts an der Funktion.

Ansonsten stehe ich leider gerade echt auf dem Schlauch was ich mit dem besagten kunstmuseum, welches bei der Initialisierung im Test mitgegeben wird, tun kann.
Du fügst einfach dem museum ein Kunstwerk hinzu mit addKunstwerk(). Steht doch schon oben wie das geht. Das Kunstwerk fügt sich selbst dem museum hinzu.
 
S

Snaer

Du fügst einfach dem museum ein Kunstwerk hinzu mit addKunstwerk(). Steht doch schon oben wie das geht. Das Kunstwerk fügt sich selbst dem museum hinzu.
Ist das aber nicht das was ich in meiner Methode addWerk bereits versuche?

Code:
public void addWerk (Kunstwerk werk) {
    this.werke.add(werk);
}
Beziehungsweise muss ich für den Aufruf kunstmuseum.addKunstwerk(this); dann eine neue Liste kunstmuseum in der Klasse Kunstwerk erstellen?
 
T

temi

Ist das aber nicht das was ich in meiner Methode addWerk bereits versuche?
Nein. Das ist eine Methode der Klasse Kunstmuseum, mit der man einem Kunstmuseum ein Kunstwerk hinzufügen kann. Damit das geschieht musst du sie natürlich auch irgendwo mal aufrufen.

Beziehungsweise muss ich für den Aufruf kunstmuseum.addKunstwerk(this); dann eine neue Liste kunstmuseum in der Klasse Kunstwerk erstellen?
Das schon gleich gar nicht. Es ist ja alles schon da, was du brauchst.
 
T

temi

Java:
class Foo {
 
    Bar bar; // Foo hat ein Bar als Instanzvariable
 
    public void setBar(Bar bar){ // und eine Methode mit der bar gesetzt werden kann
        this.bar = bar;
    }
}

class Bar {
 
    public Bar(Foo foo) { // Bar erwartet ein Foo als Parameter
        foo.setBar(this); // und setzt sich selbst als das bar von foo
    }
}

public static void main(String[] args) {

    Foo foo = new Foo();
    Bar bar = new Bar(foo);
    // jetzt gibt es sowohl eine Instanz von Foo, als auch von Bar und Foo.bar ist gleich bar. Logisch oder?
}
Und jetzt ist deine Übertragungsleistung gefordert! ;)
 
Thema: 

UML Diagramm

Passende Stellenanzeigen aus deiner Region:
Anzeige

Anzeige

Anzeige
Oben