2015-12-06 109 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。

如果没有看到更多的代码,很难更具体。

这是一个很好的问题,因为这是学习编写单元测试时的常见问题。解决这个问题将有助于你编写更好的代码。