Eclipse eigener MediaPlayer schlägt fehl bei JUnitTest

ifer

Mitglied
Hallo,

ich versuche gerade einen MediaPlayer zu erstellen. Um diesen abgeben zu dürfen, muss er bestimmte JUnitTests positiv bestehen.
Bisher habe ich das gesamte Testat implementiert. Meine eigene JUnitTests funktionieren ohne Probleme. Nur die von dem Professor gestellten JUnitTests meckern.

einmal gibts den Fehler als:

junit.framework.ComparisonFailure: getAuthor() fuer Testfall [3]: C:\my-tmp\file.mp3 nicht korrekt expected:<> but was:<null>
at junit.framework.Assert.assertEquals(Assert.java:81)
at AudioFileTest.testSettersAndGetters(AudioFileTest.java:241)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

und

junit.framework.AssertionFailedError: Fehler fuer pathname:C:\home\meier\Musik\Falco - Rock Me Amadeus.mp3:java.lang.RuntimeException: nicht gültig mit C:\home\meier\Musik\Falco - Rock Me Amadeus.mp3
at junit.framework.Assert.fail(Assert.java:47)
at AudioFileTest.testCtor(AudioFileTest.java:277)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Seit 3 Tagen versuch ich den Fehler zu finden, und bin jetzt schon langsam am durchdrehen. Ich hoffe es kann mir jemand auf die Sprünge helfen. Vielen Dank!

In der zip datei ist das gesamte Eclipse Projekt (java,Junittests etc) und das Testat zum nachvollziehen als pdf.
 

Anhänge

  • Vorfuehraufgabe06.pdf
    241,4 KB · Aufrufe: 7
Zuletzt bearbeitet von einem Moderator:

faetzminator

Gesperrter Benutzer
Beim ersten Fehler musst du einfach in der Gettermethode überprüfen, ob das Feld [c]null[/c] ist. Wenn ja, dann einen Leerstring zurückgeben. Der zeite Fehler lässt sich so nicht erkennen. Bitte poste die Zeile(n) in JUnit, welche den Test macht. Und natürlich noch die Methode(n), welche du aufrufst.
Nur wenige mögen es, ein Zip herunterzuladen und den Source Code zu durchsuchen ;)
 

ifer

Mitglied
hallo,

ah ok klingt schonma logisch. nur das problem ist das ich erst gar keine gettermethode habe. wo müsste dann diese überprüfung denn genau rein. im prinzip habe ich ja nur 2 methoden die was tun. die parsepathname und parsefilename.

der JUnit test erfolgt in der /cer/AudioFileTest.java mit den zeilen ab:

Code:
ublic void testSettersAndGetters() {
        // Use the constructor without arguments
        String current = null;
        try {
            for (int i = 0; i < pathNames.length; i++) {
                String p = pathNames[i];
                current = p;

                AudioFile af = new AudioFile();
                af.parsePathname(p);
                af.parseFilename(af.getFilename());

                assertEquals("getPathname() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", expectedPathNames[i],
                        af.getPathname());
                assertEquals("getFilename() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", expectedFileNames[i],
                        af.getFilename());
                assertEquals("getAuthor() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", authors[i], af.getAuthor());
                assertEquals("getTitle() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", titles[i], af.getTitle());
                assertEquals("toString() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", toStrings[i], af.toString());
            }
        } catch (Exception e) {
            fail("Fehler fuer pathname:" + current + ":" + e);
        }
    }

aufrufen kann ich nur 2 aktive methoden. die restlichen geben nur einen einfachen return zurück.

das mit den zip wusste ich nicht. sorry. ich kann sie gerne auch einzelnd hochladen.
 

ifer

Mitglied
oh man bin ich ein depp. weil mir das jetzt doch etwas zu unübersichtlich wurde und ich fehler nach fehler bekommen habe. habe ich die audiofile.java neuaufgestellt
Code:
import java.io.File;

public class AudioFile {

    private String pathname, filename, author, title;

    public AudioFile(String pathname) {
        
            parsePathname(pathname);
            parseFilename(getFilename());      
            
        }
    
    public AudioFile() {   
    }
    
    public void parsePathname(String pname) {
        
        pathname = pname;
        filename = "";
        int slash;
        char os = java.io.File.separatorChar;
        String pname2 = "";
        
//slashes drehen
        if(os == '\\'){
           //win - slashes drehen
            pname.replace('/', '\\');
        }
        else {
           //unix - slashes drehen
            pname.replace('\\', '/');
        }
        
//doppeltenslashes entfernen
        if(os == '\\') {
            //win
            for(int i=0; i<pname.length(); i++) {
                if(pname.charAt(i) == '\\') {
                    if(pname.charAt(i) != '\\') {
                        pname2 += pname.charAt(i);
                    }
                }
                else pname2 += pname.charAt(i);
                    
            }
            if((pname2.charAt(0) == '\\') && (pname.charAt(1) == '\\')) {
                pname2 = pname2.substring(1);
            }
            slash = pname2.lastIndexOf('\\');
            filename = pname2.substring(slash);
        }
        else {
          //unix
            if(pname.contains(":")) {
                pname.replace(":", "/");
                pname = "/" + pname;
            }
            for(int i=0; i<pname.length(); i++) {
                if(pname.charAt(i) == '/') {
                    if(pname.charAt(i+1) != '/') {
                        pname2 += pname.charAt(i);
                    }
                }
                else pname2 += pname.charAt(i);   
            }
            slash = pname2.lastIndexOf('/');
            filename = pname2.substring(slash);
        }
        
        pathname = pname2;
        return;
    }
    
    
    public String getPathname() {
        return pathname;
    }

    public String getFilename() {
        return filename;
    }

    public void parseFilename(String filename) {
        

       int i = filename.length();
       if(i>0) {
           if(filename.contains(" - ")){
            String[] split = filename.split(" - ");
           
            author = split[0];
            author = author.trim();
            
            
            title = split[1];
            title = split[1].substring(0, split[1].lastIndexOf("."));
            title = title.trim();
            }
           else {
               this.author = "";
               if(filename.contains(" - ")){
                   this.author = "";
                   this.title = "";
               }
               else 
                   if(filename.contains(".")) {
                   title = filename.substring(0, filename.lastIndexOf(".")).trim();
                   }
                   else {
                       title = filename.trim();
                   }

           }
           
       }
       else {
         title = "";
         author = "";
       }
        return;
    }

    public String getAuthor() {
        return author;
    }

    public String getTitle() {
        return title;
    }

    public String toString() {
        if (author.equals("")) {
            return getTitle();
        }
        else {
            return getAuthor() + " - " + getTitle();
        }
    }

}

somit habe ich auch den nuller fehler beseitigt. jetzt gibts nur noch junittest ne meldung für Testafall[13]: \file.mp3 nicht korrekt expected:<\[]file.mp3> but was:<\[\]file.mp3> line 263
in meinem parsepathname habe ich durch die schleife ja nachgesehen ob der nachfolger auch ein slash ist. wenn ja schleife hochzählen und neu durch. ich kann mir den ersten wiederrum nicht erklären. langsam aber sicher werd ich bissl irre :D

die methode testCtor()

Code:
public void testCtor() {
        // Perform the same getter and setter tests by using the ctor with one
        // argument for construction
        String current = null;
        try {
            for (int i = 0; i < pathNames.length; i++) {
                String p = pathNames[i];
                current = p;

                AudioFile af = new AudioFile(p);
                assertEquals("getPathname() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", expectedPathNames[i],
                        af.getPathname());
                assertEquals("getFilename() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", expectedFileNames[i],
                        af.getFilename());
                assertEquals("getAuthor() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", authors[i], af.getAuthor());
                assertEquals("getTitle() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", titles[i], af.getTitle());
                assertEquals("toString() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", toStrings[i], af.toString());
            }
        } catch (Exception e) {
            fail("Fehler fuer pathname:" + current + ":" + e);
        }
    }

    // A test case for the treatment of drive letters.
    // If a drive specifier (a single letter followed by :)
    // is provided it is to be replaced according to the platform.
    // On windows:        d: --> d:  (no transformation of drive specifier)
    // On other platform: d: --> /d/ or more precisely sep + "d" + sep

im anhang habe ihc nochmals die gesamte junittest die den testCtor beinhaltet hochgeladen
 

faetzminator

Gesperrter Benutzer
Um all die Slashes und Backslashes zu replacen kannst du einfach folgendes machen:
Java:
fileName = fileName.replaceAll("[/\\\\]+", Pattern.quote(String.valueOf(File.separatorChar)));

Da hast du nachher keine doppelten Zeichen mehr und alles wurde durch [c]File.separatorChar[/c] ersetzt.
 

ifer

Mitglied
ah klingt gut danke. jetzt habe ich das slash problem gelöst. jetzt hat er schon mal die erste hälfte der tests erfolgreich geschluckt. und wer glaubt es....die nächsten meckerein hab ich au schon wieder.

und zwar weider bei den testsettersgetters
Java:
public void testSettersAndGetters() {
        // Use the constructor without arguments
        String current = null;
        try {
            for (int i = 0; i < pathNames.length; i++) {
                String p = pathNames[i];
                current = p;

                AudioFile af = new AudioFile();
                af.parsePathname(p);
                af.parseFilename(af.getFilename());

                assertEquals("getPathname() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", expectedPathNames[i],
                        af.getPathname());
                assertEquals("getFilename() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", expectedFileNames[i],
                        af.getFilename());
                assertEquals("getAuthor() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", authors[i], af.getAuthor());
                assertEquals("getTitle() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", titles[i], af.getTitle());
                assertEquals("toString() fuer Testfall [" + i + "]: " + p
                        + " nicht korrekt", toStrings[i], af.toString());
            }
        } catch (Exception e) {
            fail("Fehler fuer pathname:" + current + ":" + e);
        }
    }

meine neue audiofile.java
Java:
public class AudioFile {

    private String pathname, filename, author, title;

    public AudioFile(String pathname) {
        
            parsePathname(pathname);
            parseFilename(getFilename());      
            
        }
    
    public AudioFile() {   
    }
    
    public void parsePathname(String pname) {

        pathname = pname;
        filename = "";
        int slash, mem = 0;
        char os = java.io.File.separatorChar;
        String pname2 = "";
  

//slashes drehen
        if(os == '\\'){
           //windows
            pname = pname.replace('/', '\\');
        }
        else {
           //unix
            pname = pname.replace('\\', '/');
        }
  
//doppeltenslashes entfernen
        if(os == '\\') {
            //windows
            for(int i=0; i<pname.length();i++) {
                if(pname.charAt(i) == '\\') {
                    if(mem == 0) {
                        pname2 += pname.charAt(i);
                        mem = 1;
                    }
                    else { mem = 1;     
                    }
                }
                else {
                    pname2 += pname.charAt(i);
                    mem = 0;
                }
            }

            if(pname2.contains("\\")) {
                slash = pname2.lastIndexOf('\\');
                slash +=1;
                
                this.filename = pname2.substring(pname2.lastIndexOf(java.io.File.separator)+1);
                

            }
            else {
                this.filename = pname2;
               
                 }
           
        }
        else {
          //unix
            for(int i=0; i<pname.length();i++) {
                if(pname.charAt(i) == '/') {
                    if(mem == 0) {
                        pname2 += pname.charAt(i);
                        mem = 1;
                    }
                    else { mem = 1;     
                    }
                }
                else {
                    pname2 += pname.charAt(i);
                    mem = 0;
                }
            }

            if(pname2.contains("/")) {
                slash = pname2.lastIndexOf('/');
                slash +=1;
                this.filename = pname2.substring(pname2.lastIndexOf(java.io.File.separator)+1);

            }
            else {
                this.filename = pname2;
            }
        
        
    }
        System.out.println(pname2);
        this.pathname = pname2;
        return;
    }
    
    public String getPathname() {
        return pathname;
    }

    public String getFilename() {
        return filename;
    }

    public void parseFilename(String filename) {
        

       int i = filename.length();
       if(i>0) {
           if(filename.contains(" - ")){
            String[] split = filename.split(" - ");
           
            author = split[0];
            author = author.trim();
            
            
            title = split[1];
            title = split[1].substring(0, split[1].lastIndexOf("."));
            title = title.trim();
            }
           else {
               this.author = "";
               if(filename.contains(" - ")){
                   this.author = "";
                   this.title = "";
               }
               else 
                   if(filename.contains(".")) {
                   title = filename.substring(0, filename.lastIndexOf(".")).trim();
                   }
                   else {
                       title = filename.trim();
                   }

           }
           
       }
       else {
         title = "";
         author = "";
       }
        return;
    }

    public String getAuthor() {
        return author;
    }

    public String getTitle() {
        return title;
    }

    public String toString() {
        if (author.equals("")) {
            return getTitle();
        }
        else {
            return getAuthor() + " - " + getTitle();
        }
    }

}


Code:
junit.framework.AssertionFailedError: Fehler fuer pathname: -  :java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	at junit.framework.Assert.fail(Assert.java:47)
	at AudioFileTest.testSettersAndGetters(AudioFileTest.java:249)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at junit.framework.TestCase.runTest(TestCase.java:164)
	at junit.framework.TestCase.runBare(TestCase.java:130)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at junit.framework.TestSuite.runTest(TestSuite.java:230)
	at junit.framework.TestSuite.run(TestSuite.java:225)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
 
Zuletzt bearbeitet:
M

maki

Gast
Hi,

ein paar Dinge die mir auffallen:
- parsePathname ist viel zu lang, 84 Zeilen, "extract Method" refactoring hilft da, macht den Code sauberer und inline Kommentare überflüssig
- der JVM ist es in hinsicht auf Pfadtrenner egal auf welchem OS es läuft, kannst Pfade immer mit [c]/[/c] als Trennzeichen nehmen, spart Code ;)
- dein Testcase testSettersAndGetters sieht seltsam aus, try/catch solltest du dir sparen (in allen Tests, ausser du testest auf eine erwartete Exception), könntest dafür ein sog. CustomAssert nutzen, auch testest du da imho zu viel -> aufspalten, macht u.U. den CustomAssert überflüssig
 

Neue Themen


Oben