2017-09-24 13 views
0

@WithMockUserテストでCommentControllerをテストしようとしていますが、ユーザーID(author_id)がnullのため、ユーザーが見つからないようですコメントの内容。テストが正しい方法で行われているかどうかはまだわかりませんが(私はまだ初心者です)、達成しようとしているのは最高のコードカバレッジですが、以前のテストでは認証されたユーザーの検索とコメント:春のブートテスト - 投稿されたコンテンツが@WithMockUserでヌルです

mockMvc.perform(get("/post/3/comment").with(authentication(authentication)).content("content")).andExpect(status().is3xxRedirection()).andExpect(view().name("redirect:/post/{id}/"));

package com.paulthemenace.blog.controllers; 
import com.paulthemenace.blog.models.Comment; 
import com.paulthemenace.blog.models.User; 
import com.paulthemenace.blog.repositories.UserRepository; 
import com.paulthemenace.blog.services.CommentService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.core.Authentication; 
import 
org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
public class CommentController { 

@Autowired 
private UserRepository userRepo; 
@Autowired 
private CommentService comSrv; 

@RequestMapping(value = "/post/{id}/comment") 
public String comment(@PathVariable("id") Long id, 
@ModelAttribute("comment") Comment comment, Model model) throws 
Exception { 

    Authentication auth = 
SecurityContextHolder.getContext().getAuthentication(); 

    if (auth != null) { 

     String name = auth.getName(); 
     User currentUser = userRepo.findByUsername(name); 

     if (comment.getContent() != "") { 

      comment.setAuthor(currentUser); 
      comSrv.create(comment); 

     } 

    } 

    return "redirect:/post/{id}/"; 
} 

} 

CommentControllerTest

import com.paulthemenace.blog.controllers.CommentController; 
    import org.junit.Before; 
    import org.junit.Test; 
    import org.junit.runner.RunWith; 

    import org.springframework.beans.factory.annotation.Autowired; 
    import org.springframework.boot.test.context.SpringBootTest; 

    import 
    org.springframework.security.test.context.support.WithMockUser; 

    import org.springframework.test.context.junit4.SpringRunner; 
    import org.springframework.test.context.web.WebAppConfiguration; 
    import org.springframework.test.web.servlet.MockMvc; 


    import static org.assertj.core.api.Assertions.assertThat; 
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 
    import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup; 

    @SpringBootTest 
    @RunWith(SpringRunner.class) 
    @WebAppConfiguration 

    public class CommentControllerTest { 


    @Autowired 
    private CommentController commentController; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
    this.mockMvc = standaloneSetup(commentController).build(); 
    } 

    @Test 
    public void controllerIsNotNull() { 
    assertThat(commentController).isNotNull(); 
    } 


    @Test 
    @WithMockUser(username = "user", password = "user") 
    public void checkIfContainsAuthenticatedUserAndCreatesComment()  
    throws Exception { 

    mockMvc.perform(post("/post/3/comment") 
       .content("comment     
    content")).andExpect(status().is3xxRedirection()) 
       .andExpect(view().name("redirect:/post/{id}/")); 


     } 


    } 

スタックトレース

https://pastebin.com/2SSKRjwd

テストは正しく行われていますか?私はこのプロジェクトをテスト駆動型開発にしたいが、私は悲惨に失敗している。 私はSpring Bootでのテストに関するリソースを探していましたが、どれもこの問題を解決できませんでした..

ありがとうございました! Barathが送られたリンクに

+1

これを確認してくださいhttps://stackoverflow.com/questions/19430365/how-to-pass-modelattrubute-parameters-using-mockmvc – Barath

答えて

1

おかげで、私はそれを修正し、そのコントローラ上の100%のコードカバレッジを得ることができた:

@Test 
@WithMockUser(username = "sure", password = "sure") 
public void checkIfContainsAuthenticatedUserAndCreatesComment() throws Exception { 

     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post("/post/3/comment"); 

    Comment com = new Comment(); 
    String name = auth.getName(); 

    User currentUser = userRepo.findByUsername(name); 

    com.setAuthor(currentUser); 
    com.setContent("ahdsf"); 

    request.flashAttr("comment", com); 


    mockMvc.perform(request).andExpect(status().is3xxRedirection()) 
       .andExpect(view().name("redirect:/post/{id}/")); 


} 

私の愚かだった何を、私はそれがまだ読んでいたことに気づきませんでしたMYSQLからのユーザーは、私はテーブルから '本当の'ユーザーを挿入する必要がありました。 もう一度おねがいします!

関連する問題