2012-03-29 91 views
1

我是EasyMock和PowerMock的新手,我被困在可能是非常基本的東西。PowerMock和EasyMock方法嘲諷問題

以下是我的代碼,我想測試

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; 
    } 
} 

}

以下是我的測試代碼...

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); 
    } 
} 

}

測試失敗因爲 assertTrue(fileOp.deleteFile(path));

我調用deleteFile(「samplePath」)時試圖執行file.exists()並返回false。但是,我嘲笑file.exists()返回true。

+0

我能解決這個問題。測試通過一次,我把文件和FileOp類在PrepareForTest的類級別 我還看到,如果我從類級別中刪除@PrepareForTest並將@PrepareForTest({File.class,FileOp.class})測試通過。 正如你在這裏看到的,我已經在方法級別放置了一個@PrepareForTest(File.class)和PrepareForTest(FileOp.class)。 這是怎麼發生的? – maverick 2012-03-30 15:45:42

回答

0

您在測試中使用的文件沒有被模擬。你有你的fileMock,但它不在你的測試中使用。要測試的方法實例在下面一行它自己的新文件對象:

File file = new File(fileName); 

如果您DELETEFILE方法將採取一個文件對象,而不是字符串,你可以有注入你mockObject,並檢查是否所有的調用都是正確的。