Tests in Spring-Boot

ExceptionOfExpectation

Aktives Mitglied
Hallo Leute, an sich komme ich mit den Tests gut voran, bis zu diesem Punkt wo es mir kein richtiger Fehler angezeigt wird:
Java:
package com.tutego.date4u.core;

import java.awt.image.BufferedImage;

import java.io.File;
import java.io.IOException;

import java.util.Base64;
import java.util.Optional;

import javax.imageio.ImageIO;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import org.mockito.junit.jupiter.MockitoExtension;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean;

import com.tutego.date4u.components.AwtBicubicThumbnail;
import com.tutego.date4u.images.FileSystem;
import com.tutego.date4u.images.PhotoService;

@SpringBootTest(properties = {"spring.shell.interactive.enabled=false"})
@ExtendWith(MockitoExtension.class)
public class CopleTest {
    
    Logger log = LoggerFactory.getLogger(getClass());
    
    @Autowired PhotoService photoService;
    @SpyBean AwtBicubicThumbnail thumbnail;
    @MockBean FileSystem fileSystem;
    

    
    @Test
    public void action(){
        
        Optional<byte[]> byteImage = photoService.download("tree");
        log.info("Der Download war erfolgreich");
        byte [] bytes = fileSystem.load("tree.jpg");
        log.info("Das Bild wurde erfolgreich geladen");
        //byte[] bytes = Files.readAllBytes(Paths.get("C:\\Users\\iRahi\\fs\\" + "tree" + ".jpg"));
        photoService.upload(bytes);
        log.info("Das Bild war erfolgreich gespeichert");
        
    }
    
    

}

Spring-Boot meldet:
Code:
15:36:49.809 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.tutego.date4u.core.CopleTest]: CopleTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
15:36:49.961 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.tutego.date4u.Date4uAppApplication for test class com.tutego.date4u.core.CopleTest

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.0)

2023-12-07T15:36:50.597+01:00  INFO 9436 --- [           main] com.tutego.date4u.core.CopleTest         : Starting CopleTest using Java 17.0.7 with PID 9436 (started by iRahi in C:\Users\iRahi\eclipse-workspace\Date4uApp)
2023-12-07T15:36:50.602+01:00  INFO 9436 --- [           main] com.tutego.date4u.core.CopleTest         : No active profile set, falling back to 1 default profile: "default"
2023-12-07T15:36:52.982+01:00  WARN 9436 --- [           main] org.jline                                : Unable to create a system terminal, creating a dumb terminal (enable debug logging for more information)

Die Methoden von zwei Delegierungsklassen (FileSystem, Thumbnail) funktionieren;
Code:
PhotoService:
        public Optional<byte[]> download(String name){
            try {    return Optional.of(fileSystem.load(name + ".jpg"));}
            catch(UncheckedIOException e) {return Optional.empty();}
        }
        public String upload(byte[] imageBytes) {
            String imageName = UUID.randomUUID().toString();
            fileSystem.store(imageName + ".jpg", imageBytes);
            byte[] thumbnailBytes = thumbnail.thumbnail(imageBytes);
            fileSystem.store(imageName + "-thumb.jpg", thumbnailBytes);
            return imageName;
        }
FileSystem:
        public byte[] load(String filename) {
            try {    return Files.readAllBytes(Paths.get(System.getProperty("user.home")).resolve("fs\\" + filename + ".jpg" )); }
            catch(IOException e) {throw new UncheckedIOException(e);}
        }
        public void store(String filename, byte[] bytes) {
            try {Files.write(Paths.get(System.getProperty("user.home")).resolve("fs\\" + filename + ".jpg" ), bytes);}
            catch(IOException e) {throw new UncheckedIOException(e);}
        }

Leider bekomme ich keine vernünftige Rückmeldung und weiß daher nicht woran es scheitert. Meine Vermutung wäre dass es hier um Mock-Objekte handelt. Das Logging funktioniert an anderen Stellen.
 

KonradN

Super-Moderator
Mitarbeiter
Im Augenblick verstehe ich Dein Problem nicht. Du machst in dem Test zwar irgendwelche Dinge, aber Du testest da ja nicht wirklich was. Tests sind immer in 3 Schritten durchzuführen:
1. Vorbereitung - hier bereitest Du alles vor, was Du für den eigentlichen Test brauchst.
2. Aufruf - Du machst, was Du testen willst.
3. Verifikation - Du prüfst, ob das, was Du bei 2. gemacht hast, das erwünschte Ergebnis gebracht hat

Nur du machst da gar nichts in dem Sinne. Daher ist es evtl. sinnvoll, wenn Du einmal genauer beschreibst was Du exakt willst und was du erwartest?
 

ExceptionOfExpectation

Aktives Mitglied
Im Augenblick verstehe ich Dein Problem nicht. Du machst in dem Test zwar irgendwelche Dinge, aber Du testest da ja nicht wirklich was. Tests sind immer in 3 Schritten durchzuführen:
1. Vorbereitung - hier bereitest Du alles vor, was Du für den eigentlichen Test brauchst.
2. Aufruf - Du machst, was Du testen willst.
3. Verifikation - Du prüfst, ob das, was Du bei 2. gemacht hast, das erwünschte Ergebnis gebracht hat

Nur du machst da gar nichts in dem Sinne. Daher ist es evtl. sinnvoll, wenn Du einmal genauer beschreibst was Du exakt willst und was du erwartest?
Du meinst ich sollte die Methoden einzeln testen? Das würde alles übersichtlicher gestalten. Ich probiere später nochmal und melde mich wieder-
Danke für den Hinweis
 

KonradN

Super-Moderator
Mitarbeiter
Du solltest Dir genau überlegen, was Du testen willst. Und dann eben immer genau diese 3 Schritte befolgen.

Und bei Unit-Tests werden kleine Units getestet. Wenn Du also in einer Klasse diese Methode hast:
Java:
        public Optional<byte[]> download(String name){
            try {    return Optional.of(fileSystem.load(name + ".jpg"));}
            catch(UncheckedIOException e) {return Optional.empty();}
        }
dann testest Du wirklich nur diese Methode.

Das bedeutet, dass Du eben fileSystem nicht testen willst. Das bedeutet also: fileSystem muss gemockt werden.

Und dann hättest Du da zwei Durchgänge:
1. Alles ohne Exception.
2. Es tritt eine UncheckedIOException auf.

Diese beiden Pfade kannst Du also Testen. Im ersten Test kannst Du dann so Dinge prüfen a.la.
- Es wird ein Optional mit der Rückgabe von fileSystem.load zurück gegeben.
aber natürlich auch etwas wie:
- fileSystem.load wird genau einmal aufgerufen

Der zweite Pfad ist ähnlich - da prüfst Du halt, dass du ein Optional.empty bekommst, wenn da eine UncheckedIOException geworfen wird.

Und ganz wichtig: Mach in jedem Test am Anfang genau diese Blöcke:
  • prepare (da kannst Du alles initialisieren, das Du so für diesen Test brauchst. Also z.B. das Mocking sicherstellen)
  • execute (Der Aufruf, den du testen willst)
  • assert (Hier kommen dann die Prüfungen. Da solltest Du ein aktuelles JUnit nehmen und dann auch ein assertAll nutzen)

Das mag evtl. am Anfang schwer sein. Aber das sollte so wirklich gemacht werden.

Du kannst aber natürlich auch andere Tests schreiben. Du kannst also z.B. so typische Testreihen aufbauen:
  • Du erzeugst eine Entity, speicherst diese
  • prüfst ob du diese laden kannst und alles korrekt ist
  • dann veränderst Du diese und speicherst und prüfst diese dann erneut nach einem laden
  • dann löschst Du diese und prüfst, dass Du diese dann nicht mehr laden kannst
Das ist auch ein valider Test. Aber das ist dann kein Unit Test mehr! Das wäre dann eher ein Regression Test oder so.

Als Entwickler solltest Du aber üben, Unit Tests zu schreiben. Wenn Du beruflich Software entwickeln willst, dann ist heutzutage meist ein agiles Vorgehen an der Tagesordnung und da übernimmt man dann meist kleine Tasks und die sind dann in der Regel erst erfüllt, wenn der Code incl. (Unit) Tests vorhanden ist. Und da willst Du wirklich nur die Unit bzw. den Bereich, den Du angepasst hast, testen.
 

ExceptionOfExpectation

Aktives Mitglied
Du solltest Dir genau überlegen, was Du testen willst. Und dann eben immer genau diese 3 Schritte befolgen.

Und bei Unit-Tests werden kleine Units getestet. Wenn Du also in einer Klasse diese Methode hast:
Java:
        public Optional<byte[]> download(String name){
            try {    return Optional.of(fileSystem.load(name + ".jpg"));}
            catch(UncheckedIOException e) {return Optional.empty();}
        }
dann testest Du wirklich nur diese Methode.

Das bedeutet, dass Du eben fileSystem nicht testen willst. Das bedeutet also: fileSystem muss gemockt werden.

Und dann hättest Du da zwei Durchgänge:
1. Alles ohne Exception.
2. Es tritt eine UncheckedIOException auf.

Diese beiden Pfade kannst Du also Testen. Im ersten Test kannst Du dann so Dinge prüfen a.la.
- Es wird ein Optional mit der Rückgabe von fileSystem.load zurück gegeben.
aber natürlich auch etwas wie:
- fileSystem.load wird genau einmal aufgerufen

Der zweite Pfad ist ähnlich - da prüfst Du halt, dass du ein Optional.empty bekommst, wenn da eine UncheckedIOException geworfen wird.

Und ganz wichtig: Mach in jedem Test am Anfang genau diese Blöcke:
  • prepare (da kannst Du alles initialisieren, das Du so für diesen Test brauchst. Also z.B. das Mocking sicherstellen)
  • execute (Der Aufruf, den du testen willst)
  • assert (Hier kommen dann die Prüfungen. Da solltest Du ein aktuelles JUnit nehmen und dann auch ein assertAll nutzen)

Das mag evtl. am Anfang schwer sein. Aber das sollte so wirklich gemacht werden.

Du kannst aber natürlich auch andere Tests schreiben. Du kannst also z.B. so typische Testreihen aufbauen:
  • Du erzeugst eine Entity, speicherst diese
  • prüfst ob du diese laden kannst und alles korrekt ist
  • dann veränderst Du diese und speicherst und prüfst diese dann erneut nach einem laden
  • dann löschst Du diese und prüfst, dass Du diese dann nicht mehr laden kannst
Das ist auch ein valider Test. Aber das ist dann kein Unit Test mehr! Das wäre dann eher ein Regression Test oder so.

Als Entwickler solltest Du aber üben, Unit Tests zu schreiben. Wenn Du beruflich Software entwickeln willst, dann ist heutzutage meist ein agiles Vorgehen an der Tagesordnung und da übernimmt man dann meist kleine Tasks und die sind dann in der Regel erst erfüllt, wenn der Code incl. (Unit) Tests vorhanden ist. Und da willst Du wirklich nur die Unit bzw. den Bereich, den Du angepasst hast, testen.
Ich hatte einen Hintergedanken das Mock-Objekt besser zu verstehen. So wie ich es verstanden habe ist ein Mock-Objekt eine Art von Proxy, daher wollte ich es testen. Ich merke mir die Vorgehensweise und setze es später um.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Spring Boot Applikation und JHM Benchmark sowie ContextConfiguration in H2 Tests ich bekomme es nicht hin Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Spring: Problem beim ausführen eines JUnit Tests. Frameworks - Spring, Play, Blade, Vaadin & Co 4
R Tests beim extracten von sub value schlägt fehl Frameworks - Spring, Play, Blade, Vaadin & Co 6
R Keine Code Coverage trotz Validen Tests? Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Integration Tests als Application? Frameworks - Spring, Play, Blade, Vaadin & Co 0
8u3631984 Ist es möglich in Spring Entity generische Listen verwenden Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Spring Boot Test Assertions mit Objekten Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Pfad zu Test Datei in application.yml in Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 7
R Spring Boot sql Beziehungen Frameworks - Spring, Play, Blade, Vaadin & Co 12
8u3631984 Spring JPA Probleme beim SPeichern von Sets Frameworks - Spring, Play, Blade, Vaadin & Co 3
M Spring Boot 3 Datenbanken zur Laufzeit Verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 5
8u3631984 Spring JDBC Probleme beim Spaltennamen Frameworks - Spring, Play, Blade, Vaadin & Co 3
LimDul Spring-Batches in Docker über Rest starten/verfolgen Frameworks - Spring, Play, Blade, Vaadin & Co 0
ExceptionOfExpectation In Meiner Spring-Boot Applikation verlangt die Datenbank Wert für eine ID Frameworks - Spring, Play, Blade, Vaadin & Co 5
R Eure Erfahrungen mit Primefaces und Spring - wer managed die Beans Frameworks - Spring, Play, Blade, Vaadin & Co 4
Avalon Get Request doppelt abfeuern ohne Post Redirect Get Pattern. Spring Boot Thymeleaf MVC Frameworks - Spring, Play, Blade, Vaadin & Co 12
thor_norsk Konfigurationsprobleme mit Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 9
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 1
R Spring Boot Integration-testing mit Keycloak Frameworks - Spring, Play, Blade, Vaadin & Co 13
L Spring Data und Rest Controller? Frameworks - Spring, Play, Blade, Vaadin & Co 4
thor_norsk Spring Boot Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 1
L Spring Data und Rest Conroller? Frameworks - Spring, Play, Blade, Vaadin & Co 4
thor_norsk Spring Boot und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Spring Amazon-SP-Api Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Aktualisiere Spring Controller Frameworks - Spring, Play, Blade, Vaadin & Co 4
L Spring Data: Modellierung mit einer Embeddable bean Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Spring Boot Test ob Validation geprüft wurde Frameworks - Spring, Play, Blade, Vaadin & Co 8
K Spring Boot OneToMany Frameworks - Spring, Play, Blade, Vaadin & Co 6
8u3631984 Spring Boot Docker Image erstellen und mit docker-compose konfigurieren Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Wann Spring Batch nutzen? Frameworks - Spring, Play, Blade, Vaadin & Co 1
P Spring Hessian Remote Beispiel Frameworks - Spring, Play, Blade, Vaadin & Co 20
8u3631984 Spring 2.7.8 Info Enpoint nicht zuerreichen Frameworks - Spring, Play, Blade, Vaadin & Co 1
gradlew.bat spring-boot:run funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
Zrebna Spring Boot/Thymeleaf: Bestätigungsemail senden. Frameworks - Spring, Play, Blade, Vaadin & Co 2
Zrebna Spring - Thymeleaf: Wieso wird gem. Fallunterscheidung entsprechende View nicht geladen? Frameworks - Spring, Play, Blade, Vaadin & Co 3
Dimax Spring UsernameNotFoundException(msg); auf der View msg ausdrücken Frameworks - Spring, Play, Blade, Vaadin & Co 1
Dimax Spring UsernameNotFoundException(Message) auf der View Message ausdrücken Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Spring Boot und JPA Error creating bean Frameworks - Spring, Play, Blade, Vaadin & Co 24
R Spring Security: Wie kommt 'UserDetails' an Username und Passwort ran? Frameworks - Spring, Play, Blade, Vaadin & Co 6
R Spring Security: Wie den User dynamisch authentifizieren? Frameworks - Spring, Play, Blade, Vaadin & Co 8
R Spring Security: Authentication & Permissions Frameworks - Spring, Play, Blade, Vaadin & Co 4
R Spring Boot: Warum soll PasswordEncoder in einer neuen Methode definiert sein? Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Cross-Origin beim Abrufen von Spring Endpoint Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Boot und Microservices Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Boot additional Datasource for a single entity Frameworks - Spring, Play, Blade, Vaadin & Co 0
T Spring Resourcen Ordner ermitteln Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Spring JPA und Repository Frameworks - Spring, Play, Blade, Vaadin & Co 12
D Mapstruct Dependency Injection funktioniert nicht mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 15
Avalon Wie sieht bei Euch das Deployment einer Spring Boot Anwendung aus? Frameworks - Spring, Play, Blade, Vaadin & Co 4
M Threads in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 7
W DI-Problem in Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Boot: Was bewirkt parent in maven genau? Frameworks - Spring, Play, Blade, Vaadin & Co 4
T Spring Security: Run-as replacement Einsatzbereich? Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Vaadin+Spring Boot erster Seitenload nach Neustart endlos Frameworks - Spring, Play, Blade, Vaadin & Co 0
doncarlito87 Wie erhalte ich ein JSON aus eine NativeQuery (Spring Boot)? Frameworks - Spring, Play, Blade, Vaadin & Co 8
Avalon @Query Select Abfrage liefert falsche Werte (Spring Boot, JPA, Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 3
Avalon Erstellung Dockerimage mit spring-boot:build-image in Spring Boot mit Umgebungsvariablen Frameworks - Spring, Play, Blade, Vaadin & Co 0
N Spring Integration - Logging Frameworks - Spring, Play, Blade, Vaadin & Co 7
D Spring Boot Field Injection in MapStruct Frameworks - Spring, Play, Blade, Vaadin & Co 5
D Spring Anfänger benötigt Hilfe Frameworks - Spring, Play, Blade, Vaadin & Co 9
OnDemand Spring Boot seltsame Logeinträge: Manipulationsversuche? Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Spring Date keine neue Tabelle fuer Attribut Frameworks - Spring, Play, Blade, Vaadin & Co 1
T Spring Security Config File anpassen Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Spring Cloud : Resttemplate mit Loadballancer Frameworks - Spring, Play, Blade, Vaadin & Co 11
Dimax Spring resource not found Frameworks - Spring, Play, Blade, Vaadin & Co 2
M Spring MongoDB unique index Frameworks - Spring, Play, Blade, Vaadin & Co 3
M Spring Entity testen Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Entity testen Frameworks - Spring, Play, Blade, Vaadin & Co 5
Dimax Spring App Probleme beim Ausführen auf dem Tomcat Server Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring WebFlux Cors konfigurieren Frameworks - Spring, Play, Blade, Vaadin & Co 1
Dimax Schöne View mit anchor scrolling in Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
Dimax Spring JPA Multiple Keys Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Security mit oauth2 in lokaler Konfiguration principal mocken Frameworks - Spring, Play, Blade, Vaadin & Co 0
D Spring Boot Mile Stone und Snapshot Versionen Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Boot Exception Body Frameworks - Spring, Play, Blade, Vaadin & Co 2
D Was ist das Framework "Spring"? Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Spring Unit/Integrations Testing Frameworks - Spring, Play, Blade, Vaadin & Co 3
D Spring Unit Test: UnsatisfiedDependencyException: Error creating bean with name Frameworks - Spring, Play, Blade, Vaadin & Co 2
H Resource Liste Lazy Autowired Spring Context Frameworks - Spring, Play, Blade, Vaadin & Co 2
M Java Spring Security Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Spring Security Login with Credentials Frameworks - Spring, Play, Blade, Vaadin & Co 0
N Spring Boot - Overkill für private Projekte? Frameworks - Spring, Play, Blade, Vaadin & Co 3
krgewb Spring und GWT - & wird zu & amp; Frameworks - Spring, Play, Blade, Vaadin & Co 2
K Migration eines internen Frameworks zu Spring:Boot Frameworks - Spring, Play, Blade, Vaadin & Co 0
OnDemand JPA/Spring Repository Like Suche leeres Ergebnis Frameworks - Spring, Play, Blade, Vaadin & Co 0
Z Hibernate & Postgres in Spring Boot (Syntaxprobleme) Frameworks - Spring, Play, Blade, Vaadin & Co 2
Z Spring Boot mit JPA;, Hibernate, Rest & Lombok Frameworks - Spring, Play, Blade, Vaadin & Co 8
M Spring Initializer - Webservices Frameworks - Spring, Play, Blade, Vaadin & Co 0
D Spring Hateoas Frameworks - Spring, Play, Blade, Vaadin & Co 1
ma095 Spring und Postgresql Errors Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring+Vaadin App startet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 1
OnDemand Spring Request externe API SSL Error Frameworks - Spring, Play, Blade, Vaadin & Co 7
OnDemand Spring Repo speichert, aber es kommt in der DB nicht an Frameworks - Spring, Play, Blade, Vaadin & Co 3
Dimax Im Spring ,Mysql-Funktion aufrufen Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand Spring Security/Boot/Vaadin Cookie Problem bei iFrame Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot: Feld ignorieren Frameworks - Spring, Play, Blade, Vaadin & Co 3
8u3631984 Spring + Thymleaf : Checkbox Object mappen Frameworks - Spring, Play, Blade, Vaadin & Co 0
N Buch zum Spring Framework bzw. Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 3
OnDemand Jasypt Spring Boot HIbernate wie komme ich an den Key? Frameworks - Spring, Play, Blade, Vaadin & Co 4
8u3631984 Spring Boot im Docker Container - Logback wird nicht verwendet Frameworks - Spring, Play, Blade, Vaadin & Co 13

Ähnliche Java Themen

Neue Themen


Oben