我对如何为我的应用程序正确编写单元测试感到困惑。 实际上我想知道我是否必须重写现有方法并修改它为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";
}
答案 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。
如果没有看到更多代码,很难更具体。
这是一个很好的问题,因为这是学习编写单元测试时的常见问题。解决这个问题将有助于您编写更好的代码。