Pfad zu Test Datei in application.yml in Spring Boot Test

8u3631984

Bekanntes Mitglied
Hallo.
Was möchte ich machen?
Ich habe eine App geschrieben, die aus einem Verzeichnis alle JPEG ausliest und weiterverarbeit. Das Verzeichnis soll aus der application.yml kommen.Dies funktioniert auch. Nun möchte ich dies auch noch testen.
Das Problem, dass in der application natürlich der Pfad zum Verzeichnis steht. Ich entwickle auf einem Windows PC. Ich lasse das Projekt unter github testen auf einer Linux Maschine.

Ich habe versucht, die Properties so anzuheften:
Java:
@SpringBootTest(properties = "photoalbum.source=[" + TestConstants.TestAlbum.toString() + "]")

Allerdings bekomme ich hier den Fehler
Code:
@SpringBootTest(properties = "photoalbum.source=[" + TestConstants.TestAlbum.toString() + "]")

So nun meine Frage (n)
wie schaffe ich es in einem @SpringBootTest PArameter aus einer application.yml hineinzureichen, die einen Dateinamen (und damit auch einen Slash) beinhalten.
Gibt es evtl. eine andere Möglichkeit, der Application zu sagen, aus welchem Verzeichnis sie die Bilder importieren soll
 

Oneixee5

Top Contributor
Beim Test wird die application.yml aus /src/test/ressources/application.yml oder mit Profil: /src/test/ressources/application.test.yml genommen. Dort kannst du deine Properties genauso reinschreiben wie in /src/java/ressources/application.yml.
Das ein Slash ein Problem sein soll habe ich noch nicht bemerkt.

Java:
@SpringBootTest
@ActiveProfiles("test")

Java:
@SpringBootTest(properties = { "photoalbum.source=" + PROPERTY_TEST_VALUE })
 

8u3631984

Bekanntes Mitglied
Ich galube ich habe mich etwas umständlich ausgedrückt.
Die application.yml wird gefunden. aber dort steht soetwas :
Java:
photoalbum:
  source:
    - "testAlbum\\photoAlbumSmall\\ocean"
Das klappt unter windows - wo ich entwickle aber nicht unter linux.

Daher würde ich diesen Parameter gerne dynamisch im Test setzen
 

8u3631984

Bekanntes Mitglied
Ich habe das Problem gefunden, muss dazu aber etwas weiter ausholen :
Also ich habe eine DataLoader Klasse, die mit einer POstContruct Annotation versehen ist:
Java:
    @PostConstruct
    protected void loadData() {       
        var albumName = "Default-Album";
        var sources = configuration.getSource();

        sources.stream().forEach(sourceFolder -> {
            var photoFiles = FileUtils.listFiles(new File(sourceFolder), new String[] { "jpg" }, true);
            log.info("found {}", kv("photoFiles", photoFiles.size()));
            photoFiles.stream().forEach(photoFile -> albumService.addItemToAlbumIfNotExists(albumName, photoFile));
            ;
        });
    }

Meine Testklasse hat eine @SpringBootTest Annotation:
Java:
@SpringBootTest
public class DataLoaderTest {

    @Mock
    private PhotoAlbumConfiguration configuration;

    @Autowired
    private AlbumService albumService;

    @Test
    void testLoadData() {
        MockitoAnnotations.openMocks(this);
        Mockito.when(configuration.getSource())
                .thenReturn(Lists.newArrayList(TestConstants.TestAlbum.toAbsolutePath().toString()));

        var dataLoader = new DataLoader(configuration, albumService);
        dataLoader.loadData();

        var albums = albumService.getAll();
        assertThat(albums).isNotNull();
        assertThat(albums.size()).isOne();

        var album = albums.get(0);
        var albumItems = album.getAlbumItems();
        assertThat(albumItems).isNotNull();
        assertThat(albumItems.size()).isEqualTo(5);

    }
}


Und genau hier liegt das Problem. Der Test schlägt fehl, da die Zeile
Code:
 var sources = configuration.getSource();
null zurückliefert. Nach meinem Verständnis, greift das Mocken zu spät ein, da ja zuerst der gesamte Spring Context hoch gefahren wird.
Evtl. habe ich auch ein Fehler in meinem Konzept. Aber die Data Loader KLasse soll die Daten aus der Configuration nach dem Start der Application herauslesen und dann im albumService weiterverarbeiten. Aber evtl. habt ihr noch eine andere Idee bzw eine Lösung für das PRoble,
 

8u3631984

Bekanntes Mitglied
Danke für deine Antwort aber wenn ich mir das Konfiguration Object "autowire" habe ich wieder das Problem mit dem Pfad :
Die Konfiguration Klasse liest ja aus der Application yml den Pfad des Quellverzeicnisse. Und der sieht in einem Linux Test System halt anders aus als in einem WIndows Entwicklungssystem. Da hier der / zu einem \ wird.
Daher war mein Ansatz das Konfiguration-Objekt zu mocken und hiermit
Java:
        Mockito.when(configuration.getSource())
                .thenReturn(Lists.newArrayList(TestConstants.TestAlbum.toAbsolutePath().toString()));
den Pfad zum Source Folder zu konfigurieren.
 

KonradN

Super-Moderator
Mitarbeiter
Und der sieht in einem Linux Test System halt anders aus als in einem WIndows Entwicklungssystem. Da hier der / zu einem \ wird.
Auch unter Windows kannst Du / nutzen. Du kannst also generell / nutzen und eben keine \. Daher ist die Frage, wo das genaue Problem ist. Du kannst also als Pfad problemlos "testAlbum/photoAlbumSmall/ocean" vorgeben.

Du brauchst also aus meiner Sicht keinerlei mocking oder so. Du solltest da problemlos mit den Spring Boot Mitteln und der Konfiguration vorgehen können.

Und das Problem mit der Reihenfolge kann ich erst einmal nicht erkennen. Wenn das @mock noch nicht gemacht worden wäre, dann hättest Du bei einem Zugriff ja eine NPE bekommen und kein Ergebnis null.
Und Du hast da zwar in DataLoader eine Annotation, aber im Test erzeugst Du ja eine eigene Instanz per new.

Aber es kann natürlich sein, dass Du im Rahmen der Elemente vom Spring Context irgendwo anders noch einen DataLoader erzeugst und der bekommt dann natürlich ein anderes configuration (das Spring Boot für den KOnstruktor erzeugt hat) und dann kann es tatsächlich sein, dass da dann ein null zurück gegeben wurde. Daher macht es Sinn, den StackTrace zu prüfen. Vermutlich bist du nicht durch var dataLoader = new DataLoader(configuration, albumService); gegangen.

Das sind aber nur Vermutungen. Meine Punkte in kurz:
  • Das Mocking selbst solltest Du nicht brauchen
  • Wenn Du in DataLoader Annotations hast für Spring Boot nach der Erzeugung der Instanz, dann sollte die Instanz auch von Spring Boot erstellt werden. (Und eben nicht selbst erzeugen mit new)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Root-Pfad zu meiner Spring Boot Application Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Spring Boot Test Assertions mit Objekten Frameworks - Spring, Play, Blade, Vaadin & Co 6
D Spring Boot Test ob Validation geprüft wurde Frameworks - Spring, Play, Blade, Vaadin & Co 8
8u3631984 Beim WebMVC Test wird Resource File nicht gefunden. Frameworks - Spring, Play, Blade, Vaadin & Co 1
T Repository wird null im Test Frameworks - Spring, Play, Blade, Vaadin & Co 6
R Wie schreibt man Test für einen Controller? Frameworks - Spring, Play, Blade, Vaadin & Co 5
D SpringBootTest H2 Database für Test Frameworks - Spring, Play, Blade, Vaadin & Co 5
M Validations-Test mit @Size Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Test Properties aus application.yml Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Spring Unit Test: UnsatisfiedDependencyException: Error creating bean with name Frameworks - Spring, Play, Blade, Vaadin & Co 2
8u3631984 Bestpractice : Test JPA Repositories Frameworks - Spring, Play, Blade, Vaadin & Co 9
8u3631984 Autowired App im Test später starten Frameworks - Spring, Play, Blade, Vaadin & Co 0
8u3631984 Spring JPA Test in Gradle Sub Module Frameworks - Spring, Play, Blade, Vaadin & Co 1
T JUnit parametrisierter Test Frameworks - Spring, Play, Blade, Vaadin & Co 4
8u3631984 Spring Test findet Component nicht Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Spring Boot Test mit Junit Frameworks - Spring, Play, Blade, Vaadin & Co 8
bueseb84 Unit Test mit Spring Boot - Service Autowired Frameworks - Spring, Play, Blade, Vaadin & Co 5
F Spring Boot Test Frameworks - Spring, Play, Blade, Vaadin & Co 14
S Integrations Test in Java mit Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
J Test mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Transaktionaler Spring Test ohne von AbstractTransactionalJUnit4SpringContextTests zu erben Frameworks - Spring, Play, Blade, Vaadin & Co 4
R Wohin gehört diese Datei? Frameworks - Spring, Play, Blade, Vaadin & Co 1
8u3631984 Vesionsnummern aus externer Datei - sinnvoll und wenn ja wie ? Frameworks - Spring, Play, Blade, Vaadin & Co 5
K Laden einer Datei vom Netzlaufwerk mit LDAP-Authentifizierung Frameworks - Spring, Play, Blade, Vaadin & Co 3
M Ich kann in dieser datei keine Daten speichern Frameworks - Spring, Play, Blade, Vaadin & Co 5
Avalon CSS Datei wird in Spring Boot mit Thymeleaf im Standardordner nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 3
S Spring Boot: Wert aus Config Datei ermitteln Frameworks - Spring, Play, Blade, Vaadin & Co 3
L Spring Actions ohne zugehörige JSP View Datei ausführen Frameworks - Spring, Play, Blade, Vaadin & Co 0
R Txt Datei mit Notepad öffnen und zu bestimmter Zeile springen Frameworks - Spring, Play, Blade, Vaadin & Co 12
D Datei auslesen , Leerzeile überspringen Frameworks - Spring, Play, Blade, Vaadin & Co 15
S Spring Bean aus Datei referenzieren? Frameworks - Spring, Play, Blade, Vaadin & Co 2

Ähnliche Java Themen

Neue Themen


Oben