如何正确编写JUnit测试?

时间:2015-12-06 14:12:40

标签: java unit-testing junit

我对如何为我的应用程序正确编写单元测试感到困惑。 实际上我想知道我是否必须重写现有方法并修改它为junit或只是调用我现有的方法并使用assert。 到目前为止,我使用第二种选择,但我遇到了一个问题。 例如,在Controller方法中,我获取当前登录的用户并将其传递给某些服务。如果我通过JUnit调用此方法,它将显示null异常,因为没有登录用户。 所以, 1)我是否必须重写这些方法用于测试目的? 2)调用现有方法并使用断言是否合适? 感谢

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

3 个答案:

答案 0 :(得分:1)

  

实际上我想知道我是否必须重写现有方法并为junit修改它,或者只是调用我现有的方法并使用assert。

只需调用你的exiting方法,实际上junit是在为调用方法编写逻辑之前编写的。

示例:

如果要测试int square(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。

  

关于第二个问题,

你必须阅读Mocking。

答案 1 :(得分: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答案提供了更多详细信息。

基本上你要找的是单元测试休息控制器。

答案 2 :(得分:0)

您需要做的是在测试中,提供一个假的userService,该函数将为User提供与该测试相关的属性。

在测试之前,您需要将this.userService设置为FakeUserService。

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

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