2012-03-29 10 views
1

Ich bin neu in EasyMock und PowerMock und ich bin wahrscheinlich auf etwas fest, das sehr einfach ist.PowerMock und EasyMock-Methode spottend Problem

Es folgt mein Code, Ich mag würde

import java.io.File; 

public class FileOp() { 
private static FileOp instance = null; 
public string hostIp = ""; 

public static FileOp() { 
    if(null == instance) 
     instance = new FileOp(); 
} 

private FileOp() { 
    init(); 
} 

init() { 
    hostIp = "xxx.xxx.xxx.xxx"; 
} 

public boolean deleteFile(String fileName) { 
    File file = new File(fileName); 
    if(file.exists()) { 
     if(file.delete()) 
      return true; 
     else 
      return false; 
    } 
    else { 
     return false; 
    } 
} 

}

Folgende ist mein Testcode ...

import org.easymock.EasyMock; 
    import org.junit.Test; 
    import org.junit.runner.RunWith; 
    import org.powermock.api.easymock.PowerMock; 
    import org.powermock.core.classloader.annotations.PrepareForTest; 
    import org.powermock.modules.junit4.PowerMockRunner; 
    import org.powermock.reflect.Whitebox; 

    import java.io.File; 

    import static org.easymock.EasyMock.expect; 
    import static org.junit.Assert.assertFalse; 
    import static org.junit.Assert.assertTrue; 

    @RunWith(PowerMockRunner.class) 
    @PrepareForTest(FileOp.class) 
    public class FileOp_JTest 
    { 

@Test 
@PrepareForTest(File.class) 
public void deleteFile_Success(){ 
    try { 
     final String path = "samplePath"; 

     //Prepare 
     File fileMock = EasyMock.createMock(File.class); 

     //Setup 
     PowerMock.expectNew(File.class, path).andReturn(fileMock); 
     expect(fileMock.exists()).andReturn(true); 
     expect(fileMock.delete()).andReturn(true); 

     PowerMock.replayAll(fileMock); 

     //Act 
     FileOp fileOp = Whitebox.invokeConstructor(FileOp.class); 
     assertTrue(fileOp.deleteFile(path)); 

     //Verify 
     PowerMock.verifyAll(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     assertFalse(true); 
    } 
} 

}

Der Test nicht getestet wird wegen assertTrue (fileOp.deleteFile (Pfad));

Ich verfolgt es auf deleteFile ("samplePath") beim Aufruf versucht, file.exists() zu tun und es gibt false zurück. Allerdings habe ich file.exists() verspottet, um true zurückzugeben.

+0

Ich konnte das Problem beheben. Der Test bestanden, nachdem ich sowohl die Datei-und FileOp Klassen auf der Klassenebene für PrepareForTest Ich sah auch, dass, wenn ich @PrepareForTest von der Klassenebene entfernen und @PrepareForTest ({File.class, FileOp.class}) die Tests bestehen. Wie Sie hier sehen können, habe ich einen @PrepareForTest (File.class) auf Klassenebene und PrepareForTest (FileOp.class) auf Methodenebene gesetzt. Warum passiert das? – maverick

Antwort

0

Die Datei, die Sie in Ihrem Test verwenden, wird nicht gespottet. Sie haben Ihren fileMock, aber er wird nicht in Ihrem Test verwendet. Die Methode, die Sie Tests sind instanziert sein eigenes frisches File-Objekt in der folgenden Zeile:

File file = new File(fileName); 

Wenn Ihr deleteFile Methode ein File-Objekt anstelle eines String dauern würde, könnten Sie Ihre MockObject dort injizieren und prüfen, ob alle Anrufe korrekt sind.