2015-12-06 146 views
0

我對如何爲我的應用程序正確編寫單元測試感到困惑。 其實我想知道如果我必須重寫一個存在的方法,並修改它的junit或只是調用我的存在的方法,並使用斷言。 到目前爲止,我使用第二個選項,但我遇到了一個問題。 例如,在Controller方法中,我獲取當前登錄的用戶並將其傳遞給某些服務。如果我通過JUnit調用這個方法,它將顯示空的異常,因爲沒有登錄用戶。 那麼, 1)我是否必須重寫這些類型的方法用於測試目的? 2)無論如何調用已有的方法並使用斷言是否合適? 感謝如何正確編寫JUnit測試?

@RequestMapping(value="/like", method=RequestMethod.GET) 
public String msgLike(@RequestParam("msgId") long messageId, @RequestParam("like") boolean like){ 

    User user = new User(); 
    user = this.userService.getUserByName(this.userService.getLoggedInUsername()); //NULL EXCEPTION HERE WHEN TESTING 

    if(!messageService.checkIfLiked(user, messageId)){ 
     if(like){ 
      messageService.insertLike(messageId); 
      messageService.insertMessageUserLike(user, messageId); 
     } 
     if(!like){ 
      messageService.insertDislike(messageId); 
      messageService.insertMessageUserLike(user, messageId); 
     } 
    } 

    return "redirect:/home"; 
} 
+0

您可能想提供有關您問題的更多詳細信息。你能展示一個你想要測試的代碼示例,並明確指出問題出在哪裏? –

+0

@Fido我發佈了一個我試圖測試的方法。 – wr21

回答

1

其實我想知道如果我要重寫一個已經存在的方法,並修改它的JUnit或只是我的存在的方法和使用斷言。

只要調用你的退出方法,實際上junit是在編寫調用方法的邏輯之前編寫的。

例子:

如果你想測試INT方(INT NUM)方法,該方法找到給出NUM的平方,
所以這樣寫Junits,

@Test 
    squareTest() { 
    int square = objectName.square(3); 
    assertThat(square , is(equalTo(9))); 
    } 

而像編碼時完成這個,

int square(int a) { 
result=a*a; 
return result; 
} 

運行你的Junit。

關於第二個問題,


您必須閱讀嘲諷。

0

在你的情況下,你正試圖測試一個其餘的控制器,當測試普通方法時稍有不同。例如下面的方法:

public MyClass{ 
    public static int sum(int a, int b){ 
     return a + b; 
    } 
} 

可以簡單地通過測試:

@Test 
public void testSum(){ 
    assertEquals(3, MyClass.sum(1, 2)); 
} 

但在你的情況,你需要控制API來正確使用。即您需要登錄的用戶。爲此,您需要按照用戶的意願測試您的控制器。 This提供了一些解釋過程和this答案提供了更多的細節。

基本上你正在尋找的是單元測試休息控制器。

0

你需要做的是在測試中,提供一個假的userService,它將爲用戶提供與該測試相關的屬性。

在測試之前,您需要將this.userService設置爲您的FakeUserService。

如果沒有看到更多的代碼,很難更具體。

這是一個很好的問題,因爲這是學習編寫單元測試時的常見問題。解決這個問題將有助於你編寫更好的代碼。