2016-11-27 14 views
1

私はマイクロサービスアプリケーションを開発しており、投稿要求 をコントローラにテストする必要があります。テストは手動で行われますが、テストケースは常にnullを返します。MockMvcはオブジェクトの代わりにnullを返します

私はここでStackoverflowとドキュメントで多くの類似の質問を読んだが、まだ私が逃しているものは分かっていない。ここで

は、私が現在持っていると私はそれを動作させるためにしようとしたものです:

//Profile controller method need to be tested 
@RequestMapping(path = "/", method = RequestMethod.POST) 
public ResponseEntity<Profile> createProfile(@Valid @RequestBody User user, UriComponentsBuilder ucBuilder) { 
    Profile createdProfile = profileService.create(user); // line that returns null in the test 
    if (createdProfile == null) { 
     System.out.println("Profile already exist"); 
     return new ResponseEntity<>(HttpStatus.CONFLICT); 
    } 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setLocation(ucBuilder.path("/{name}").buildAndExpand(createdProfile.getName()).toUri()); 
    return new ResponseEntity<>(createdProfile , headers, HttpStatus.CREATED); 
} 

//ProfileService create function that returns null in the test case 
public Profile create(User user) { 
    Profile existing = repository.findByName(user.getUsername()); 
    Assert.isNull(existing, "profile already exists: " + user.getUsername()); 

    authClient.createUser(user); //Feign client request 

    Profile profile = new Profile(); 
    profile.setName(user.getUsername()); 
    repository.save(profile); 

    return profile; 
} 

// The test case 
@RunWith(SpringRunner.class) 
@SpringBootTest(classes = ProfileApplication.class) 
@WebAppConfiguration 
public class ProfileControllerTest { 

    @InjectMocks 
    private ProfileController profileController; 

    @Mock 
    private ProfileService profileService; 

    private MockMvc mockMvc; 

    private static final ObjectMapper mapper = new ObjectMapper(); 

    private MediaType contentType = MediaType.APPLICATION_JSON; 

    @Before 
    public void setup() { 
     initMocks(this); 
     this.mockMvc = MockMvcBuilders.standaloneSetup(profileController).build(); 
    } 
    @Test 
    public void shouldCreateNewProfile() throws Exception { 

     final User user = new User(); 
     user.setUsername("testuser"); 
     user.setPassword("password"); 

     String userJson = mapper.writeValueAsString(user); 

     mockMvc.perform(post("/").contentType(contentType).content(userJson)) 
       .andExpect(jsonPath("$.username").value(user.getUsername())) 
       .andExpect(status().isCreated()); 

    } 
} 

はポストの前にwhen/thenReturnを追加しようとしましたが、まだヌルオブジェクトに409応答を返します。

when(profileService.create(user)).thenReturn(profile); 
+0

データベースにユーザーの詳細が既にあります。 – developer

+0

テストケースではメモリ内のデータベースを使用しており、通常は起動時にエントリがありません。 – user3127632

答えて

2

あなたはテスト中に偽のprofileServiceを使用しています。あなたは何を返すのかを決して知らせません。したがって、nullを返します。あなたが適切に等号を(上書きする場合

when(profileService.create(user).thenReturn(new Profile(...)); 

を使用してのみ動作することをあなたは

when(profileService.create(any(User.class)).thenReturn(new Profile(...)); 

ようなものが必要

注)(とhashCode())Userクラスでは、実際のユーザー理由コントローラが受け取るインスタンスは、同じインスタンスではなく、テストで使用しているユーザーのシリアル化/逆シリアル化されたコピーです。

+0

任意の(User.class)とoverride equals()/ hashCode()の両方が私の問題を解決しました。どうもありがとうございました。このケースではどちらを使用するのが適切だと思いますか? – user3127632

+0

私は一般に、エンティティでequals()とhashCode()を定義することを避けます。それは解決するよりも多くの問題を引き起こし、それらのための良い実装を見つけるのは難しいです。だから私はここ、または別のマッチャーを使用します。 –

関連する問題