2017-07-25 159 views
1

JUnit測試功能我有一個類裏面的函數:它返回一個字符串

public String covertToLowerCase(String sliceName) { 
     sliceName = sliceName.trim().toLowerCase(); 
     sliceName = sliceName.replaceAll("\\.txt$|\\.dat$", ""); 
     return sliceName; 
    } 

我要測試的這款使用JUnit。我創建了具有以下一個單獨的測試文件:

public class MyControllerTest { 

    private MyController myController; 
    private static final String SLICE_NAME = "Hello World"; 

    @Test 
    public void shouldReturnSanitizedString() throws Exception { 
    String expected = myController.covertToLowerCase(SLICE_NAME); 
    // assert that actual and expected are same 
    } 

我無法理解如何測試這和所有其他的示例是特定於它們的功能。我只是想讓函數返回一個消毒過的字符串?我怎麼去解決這個問題?

+1

這是什麼意思「消毒」,你的正則表達式好像簡單地從字符串中刪除txt或dat擴展名。無論如何,你應該對'String expected =「hello world」;''進行測試,然後'String actual = myController.covertToLowerCase(SLICE_NAME);'然後'assetEquals(expected,actual)'。然後,您想要在其他不同的輸入上進行相同的測試,例如:「test.txt」,「test.dat」,「test.doc」,「」,... –

+0

我不明白。爲什麼你將返回值賦給一個名爲'expected'的變量?這應該是「實際」。 「預期」就是你實際期待的結果。 –

+0

測試中初始化的字段* myController在哪裏?如果函數/方法是* static *,則可以在不進行初始化的情況下使用和測試。 – howlger

回答

1

要測試,首先必須準備要測試的數據,輸入值,期望值=>調用具有輸入值的測試函數=>獲取測試中函數的實際值返回值=>聲明期望值與實際價值。這是您可以使用的list of assert function

public class MyControllerTest { 

    private MyController myController; 
    private final String SLICE_NAME = "Hello World"; 
    private final String expected = "hello world"; 

    @Test 
    public void shouldReturnSanitizedString() throws Exception { 
    String actual = myController.covertToLowerCase(SLICE_NAME); 
    // assert that actual and expected are same 
    assertEquals(expected, actual); 
    } 
} 
+0

如果我想測試一些其他功能:public String createSqlFromSchema(List mapSchemas){ String template =「%s%s」; 列表 colList = mapSchemas.stream()。map(m - > String.format(template,m.getColName(),m.getDataType())) .collect(Collectors.toList()); return String.join(「\ n」,colList); }。我必須在測試功能中提供哪些參數?當我記錄當前參數時,它顯示一個參考值而不是實際值。 –

+2

@TeeJay當您有新問題時,請提出一個新問題。不要進入「評論中的更多問題」乒乓球。此外:你認爲*任何人*想閱讀註釋中編寫的源代碼嗎? – GhostCat

+1

@TeeJay請注意@ GhostCat的評論。 最重要的是你需要在使用它之前瞭解[junit](https://www.tutorialspoint.com/junit/)。 對於你的問題,你需要測試函數'createSqlFromSchema(List mapSchemas)'這個函數的輸入必須是'List ',讓我們初始化你的列表並傳遞給測試函數。更多的事情,你想要得到一個列表的價值,然後逐一去獲取價值。 –

1

爲了記錄在案,更「真實世界」測試寧願像:

public class MyControllerTest { 
    private MyController underTest = new MyController(); 

    @Test(expected=NullPointerException.class) 
    public void testConvertToLowerCaseWithNull() { 
    underTest.convertToLowerCase(null); 
    } 

以上僅僅是一個例子 - 你的方法可以決定例如拋出一個IllegalArgumentException代替。並且您想要確保您的生產代碼確實實際上會爲無效情況拋出異常。

@Test 
    public void testConvertToLowerCaseWithEmptyInput() { 
    assertThat(underTest.convertToLowerCase(""), is("")); 
    } 

我推薦使用assertThat(),連同hamcrest匹配器 - 作爲所產生的代碼只是更容易閱讀和理解。

然後你繼續添加更多的測試用例。你退後一步,你想在這裏測試的東西前瞻。你要確保「e」保持「e」,「E」變成「e」......等等。

這裏其他的事情:

  • 尤其是做這樣的輸入/輸出,只有當測試---做測試方法使用領域/常量。你想盡可能多的測試你的測試自包含。爲了理解我的測試 - 你只需要看看方法體。你的方法要求你查找那些常量實際包含的內容!
  • 確切地說:絕對沒有必要讓在您的測試方法上拋出異常。它不會拋出 - 所以簽名不應該公佈!
  • 不好命名在您的生產代碼。你的方法沒有只有變成小寫。它也取代了內容。方法名稱應該表達這一點。截至目前,該方法的名稱是誤導。這是你的代碼可以做的最糟糕的事情:誤導讀者相信代碼的功能,但是做更多/其他的事情!