Länge eines Arrays in einem Objekt testen

Diskutiere Länge eines Arrays in einem Objekt testen im Java Basics - Anfänger-Themen Bereich.
N

nikva

Hallo Java-Forum!
Ich sitze grade an einer Programmieraufgabe zum Thema Vererbung,Arrays und jUnit Tests.
An diesem jUnit Test hänge ich aber grade etwas fest(die Vorlesung dazu fiel aufgrund der Corona-Situation aus)

Ich versuche den tatsächlichen Wert in die AssertEquals Methode einzubauen aber der compiler erkennt den Typ nicht.
Im Anhang befindet sich die Aufgabenstellung und nachfolgend die Klassen.
Hoffe mir kann hier jemand weiterhelfen :)

Java:
package edu.hm.cs.swe2.shoppingmall;

public class ShoppingMall {

    public Shop[] shops;

    public ShoppingMall(int shopCount) {
        if (shopCount < 1 || shopCount > 500) {
            shopCount = 10;
        } else {
            this.shops = new Shop[shopCount];
        }
    }

    public int addShops(Shop... shopsToAdd) {
        int currentnumber = 0;
        int notPlacable = 0;
        for (Shop shop : shopsToAdd) {
            if (this.shops.length <= currentnumber + 1 && this.shops[currentnumber] != null) {
                this.shops[currentnumber] = shop;
            } else {
                notPlacable++;
            }
            currentnumber++;
        }
        return notPlacable;
    }

    public float calculateRent() {
        float totalRent = 0;

        return totalRent;
    }
}
Java:
package edu.hm.cs.swe2.shoppingmall;

import java.time.LocalDateTime;

public class Shop {

    private int area;
    private String name;
    private int rent;
    private LocalDateTime openingTime;
    private LocalDateTime closingTime;

    private Shop(int area, String name, int rent) {

    }

    public String toString() {
        return String.format("name: %s area: %s rent: %s", name, area, rent);
    }

    public int getArea() {
        return this.area;
    }

    public void setArea(int area) {
        this.area = area;
    }

    public int getRent() {
        return this.rent;
    }

    public void setRrea(int area) {
        this.area = area;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
Java:
package edu.hm.cs.swe2.shoppingmall;

public class SecurityCountable {
    int personCount;

    void addPerson() {
        personCount = personCount + 1;

    }

    void removePerson() {
        personCount = personCount - 1;
    }

    int showPersonCount() {
        return personCount;
    }

    // Methode die einen Alarm ausgibt
}
Java:
package edu.hm.cs.swe2.shoppingmall;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

class ShoppingMallTest {

    @Test
    void TestShoppingMall() {
        int shopCountTest = 0;
        ShoppingMall TestShoppingMall = new ShoppingMall(shopCountTest);
        int expectedResult = 10;
        int actualResult = 0;

        assertEquals(expectedResult, ShoppingMall(0));
    }
}
 

Anhänge

H

httpdigest

Ja, vielen Dank für die Aufgabe.
Aber: Wobei können wir dir denn hier helfen? Wo hast du noch Probleme? Was fehlt dir, um die Aufgabe selbst lösen zu können? Warum sollte jemand überhaupt die 5 PDF Seiten voll mit Aufgaben und Unteraufgaben lesen, ohne überhaupt zu wissen, was das genaue Problem ist?
 
N

nikva

Mein Problem ist wie gesagt das Testen der Klasse ShoppingMall durch einen JUnit Test(ShoppingMallTest). Ich scheitere grade daran den tatsächlichen Wert mit dem erwarteten Wert zu vergleichen
Die Aufgabe um die es geht ist Aufgabe 4 d)
 
W

White_Fox

Ich scheitere grade daran den tatsächlichen Wert mit dem erwarteten Wert zu vergleichen
Dafür nimmt man meistens eine der assertEquals()-Methoden. Wenn du damit Objekte vergleichst, solltest du die .equals()-Methode deiner Klassen entpsrechend überschreiben. Arrays werden mit assertArrayEqua() verglichen.
 
N

nikva

Aber ich will ja hier keine Arrays miteinander vergleichen sondern die Länge zweier Arrays miteinander vergleichen.
Das Array aus ShoppingMall mit dem Paramater 0 soll zum Beispiel ein Array der Länge 10 ausgeben
 
T

temi

ShoppingMall ist eine Klasse. Was ShoppingMall(0) bewirken soll, erschließt sich mir nicht.

Vielleicht möchtest du ja was mit der Instanz dieser Klasse anstellen ShoppingMall TestShoppingMall = new ShoppingMall(shopCountTest);?

Nebenbei: Variablen werden in Java konventionsgemäß mit einem Kleinbuchstaben am Anfang geschrieben.

Wenn du die Länge eines Arrays brauchst, dann erhältst du die mit array.length, allerdings nur die definierte Länge, nicht die tatsächliche.
 
Zuletzt bearbeitet:
N

nikva

Java:
public class ShoppingMall {

    public Shop[] shops;

    public ShoppingMall(int shopCount) {
        if (shopCount < 1 || shopCount > 500) {
            shopCount = 10;
        } else {
            this.shops = new Shop[shopCount];
        }
    }
Hiermit soll ja immer ein Array erstellt werden mit einer Länge die die Anzahl der shops beschreibt mit Standartwert 10 falls er nicht zwischen 1 und 500 liegt

Java:
    @Test
    public void TestShoppingMall() {
        int shopCountTest = 0;
        ShoppingMall TestShoppingMall = new ShoppingMall(shopCountTest);
        int expectedResult = 10;
        int actualResult = // hier soll jetzt der vergleichswert hin der in SHoppingMall mit 0 als Parameter entsteht
        assertEquals(expectedResult, actualResult);
    }
}
 
T

temi

Steht inzwischen alles schon hier in den Beiträgen.

Edit: Oder ist die Frage, wie du auf das Feld "shops" der Instanzvariablen zugreifen kannst?

Das geht mit TestShoppingMall.shops. Die Variable sollte allerdings, wie schon geschrieben, besser "testShoppingMall" heißen.
 
Zuletzt bearbeitet:
H

httpdigest

Java:
public ShoppingMall(int shopCount) {
    if (shopCount < 1 || shopCount > 500) {
        shopCount = 10;
    } else {
        this.shops = new Shop[shopCount];
    }
}
Hiermit soll ja immer ein Array erstellt werden mit einer Länge die die Anzahl der shops beschreibt mit Standartwert 10 falls er nicht zwischen 1 und 500 liegt
Dann teste diesen Konstruktor mal gut. Wenn die Tests gut sind, werden sie da noch einen Fehler feststellen. :)
 
N

nikva

Java:
public class ShoppingMallTest {

    @Test
    public void TestShoppingMall() {
        int shopCountTest = 0;
        ShoppingMall testShoppingMall = new ShoppingMall(shopCountTest);
        int expectedResult = 10;
        int actualResult = testShoppingMall.length;
        assertEquals(expectedResult, actualResult);
    }
}
Jetzt kriege ich die Meldung "length cannot be resolved or is not a field", die ich beheben kann indem ich eine Variable "length in ShoppingMall erzeuge. Dies ist aber genau das was ich ja nicht will.
 
T

temi

die ich beheben kann indem ich eine Variable "length in ShoppingMall erzeuge. Dies ist aber genau das was ich ja nicht will.
Du hast doch schon ein passendes Feld in ShoppingMall, das auch über die Eigenschaft length verfügt. Du solltest wirklich lesen, was hier geschrieben wird.
 
N

nikva

Vielleicht stell ich mir das ganze auch ganz falsch vor.
Zuerst erstelle ich die Testmethode, dann lege ich einen Testwert fest der als Parameter für den Kontruktor der Klasse ShoppingMall dient. Danach lege ich einen erwarten Wert fest und vergleiche den Wert über die AssertEquals Methode mit dem Ergebnis aus dem Konstruktor der ShoppingMall. Wenn ich jetzt aber versuche nach dem erstellen der Beispiel-ShoppingMall die Länge aufzurufen kommt die Fehlermeldung "length cannot be resolved or is not a field. Es tut mir Leid wenn ich euch hier nerve aber ich komme einfach nicht dahinter wo der Fehler liegt. Anscheinend erzeugt meine Testmethode ja kein Testarray, dass ich vergleichen kann? Ich habe es auch mit einem Array als expected Result probiert(Shop[] expectedResult = Shop[10] und dann mit AssertArrayequals zu vergleichen

Java:
package edu.hm.cs.swe2.shoppingmall;

import org.junit.jupiter.api.Test;

public class ShoppingMallTest {


    @Test
    public void testShoppingMall() {
        int shopCountTest = 0;
        // Testwert bestimmen
        ShoppingMall testShoppingMall = new ShoppingMall(shopCountTest);
        // erzeugt ein Objekt ShoppingMall mit Testwert
        int expectedResult = 10;
        // zu erwartender Array der durch Shoppingmal erzeugt wird mit Testwert 0
        int actualResult = testShoppingMall.length; //cannot be resolved or is not a field
    }

}

Java:
package edu.hm.cs.swe2.shoppingmall;

public class ShoppingMall {

    public Shop[] shops;

    public ShoppingMall(int shopCount) {
        if (shopCount < 1 || shopCount > 500) {
            shopCount = 10;
        } else {
            this.shops = new Shop[shopCount];
        }
    }

    public int addShops(Shop... shopsToAdd) {
        int currentnumber = 0;
        int notPlacable = 0;

        for (Shop shop : shopsToAdd) {
            if (this.shops.length <= currentnumber + 1 && this.shops[currentnumber] != null) {
                this.shops[currentnumber] = shop;
            } else {
                notPlacable++;
            }
            currentnumber++;
        }
        return notPlacable;
    }

    public float calculateRent() {
        float totalRent = 0;

        return totalRent;
    }
}
 
H

httpdigest

Java:
        ShoppingMall testShoppingMall = new ShoppingMall(shopCountTest);
        // erzeugt ein Objekt ShoppingMall mit Testwert
        int expectedResult = 10;
        // zu erwartender Array der durch Shoppingmal erzeugt wird mit Testwert 0
        int actualResult = testShoppingMall.length; //cannot be resolved or is not a field
Überlege doch mal bitte, was du hier machst... `testShoppingMall` bzw. ein ShoppingMall selbst hat doch kein `length` Attribut.... die `shops` Instanzvariable in einem `ShoppingMall` hat length.
 
mihe7

mihe7

length ist ein Attribut eines Arrays. Du hast aber ein Objekt vom Typ Shoppingmall. Wenn Du die Länge des shops-Arrays abrufen willst, spendierst Du der Klasse eine Methode und verwendest diese, z. B.
Java:
public int size() {
    return shops.length;
}
 
N

nikva

Java:
package edu.hm.cs.swe2.shoppingmall;

import org.junit.jupiter.api.Test;

public class ShoppingMallTest {

    @Test
    public void testShoppingMall() {
        int shopCountTest = 0;
        // Testwert bestimmen
        ShoppingMall testShoppingMall = new ShoppingMall(shopCountTest);
        // erzeugt ein Objekt ShoppingMall mit Testwert
        int expectedResult = 10;
        // zu erwartende Länge des Array der durch Shoppingmal erzeugt wird mit Testwert
        // 0

        assertEquals(expectedResult, shops.size());// shops cannot be resolved
    }

}
auch über die Methode funktioniert es in meiner Testmethode nicht. Stimmt denn überhaupt der generelle Ansatz oder bin ich komplett auf dem Holzweg?
 
J

JustNobody

Wenn Du diese Größe von außen prüfen willst, dann musst Du diese von Außen zugreifbar machen. Das ist das, was mihe7 ja bereits auch so beschrieben hat.
 
T

temi

Ich glaube du verstehst nicht, worauf wir hinaus wollen:
Java:
ShoppingMall testShoppingMall = new ShoppingMall(shopCountTest); // deine Instanz von ShoppingMall

// entweder du greifst direkt auf das Attribut zu
int actualResult = testShoppingMall.shops.length;

// oder über eine Methode, wie von mihe7 vorgeschlagen
int actualResult = testShoppingMall.size();
Die zweite Möglichkeit ist die bessere.
 
Thema: 

Länge eines Arrays in einem Objekt testen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben