2016-06-27 60 views
-1

我看過好幾次了new關鍵字在你的代碼的任何地方說謊是一個代碼的氣味,使測試困難。這裏是代碼片段我的工作:如何使給定的代碼更易於測試?

private void uploadTagsToCloudStorage(Optional<String> filename, String tags) throws IOException { 
    if (!filename.isPresent()) { 
     return; 
    } 
    GcsFilename gcsfilename = new GcsFilename(gcsBucketName, filename.get()); 
    GcsFileOptions options = 
     new GcsFileOptions.Builder().mimeType("text/html").acl("public-read").build(); 
    try (GcsOutputChannel writeChannel = gcsService.createOrReplace(gcsfilename, options)) { 
     PrintWriter gcswriter = 
      new PrintWriter(Channels.newWriter(writeChannel, StandardCharsets.UTF_8.toString())); 
     gcswriter.println(decode(tags)); 
     gcswriter.flush(); 
     writeChannel.waitForOutstandingWrites(); 
    } 
    } 

我使用Guice注入gcsService但我仍然看到許多new關鍵字左右。我患有不良設計嗎?或者這種情況是不可避免的?

+0

使用'new'在C++通常爲代碼的氣味。我沒有聽說過有關Java的指導。 – NathanOliver

+1

不知道那些其他人從哪裏獲取他們的信息,但當然使用** new **對於您的代碼的易測性有多大**影響。每個人都在說別的......抱歉的人們,你在過去的10年裏從哪裏度過的。只是指出https://www.youtube.com/playlist?list=PLD0011D00849E1B79(ESP視頻2)10年前說的很清楚爲什麼「不明智」的使用「新」,完全打破你做單元測試的能力。 – GhostCat

+0

@ user1803551請參閱https://www.youtube.com/playlist?list=PLD0011D00849E1B79 ......視頻沒有。 2給你非常詳細的關於「新問題」的見解。並注意:這就像10年的知識。 – GhostCat

回答

1

使用「新」來創建對象,使測試困難,因爲你不能在不同的實現之間輕易改變。例如,依賴注入允許您在不改寫代碼的情況下在模擬gcsService或實際gcsService impl之間進行切換。

在您的例子並不新鮮,GcsFilename(),也沒有新的PrintWriter()會發生很大的變化,從而用「新」我看不出有什麼問題。 GcsFileOptions.Builder().. build()看起來像一個靜態方法,你不需要「新」來獲得選項。