2016-09-15 13 views
1

APIを使用してWebアプリケーションのテストを作成し、コントローラメソッドをテストします。コントローラは、私が嘲笑したいサービスメソッドを使います。 テストコード:メソッドを使用してモックを使用する場合

UserService.save(ユーザ)がNULLであった場合、それはいくつかのユニークなロング値にユーザのIDプロパティを設定呼ば
@Mock 
private UserService userService; 
@Mock 
private PasswordEncoder passwordEncoder; 
@InjectMocks 
private UserApi userApi; 

    MockitoAnnotations.initMocks(this); 
    mockMvc = MockMvcBuilders.standaloneSetup(userApi).build(); 

@Test 
public void addUser() throws Exception { 
    Role role = new Role(1L, "ROLE_USER"); 
    User user = new User (null, "Test user", "Test password", true, role); 
    when(roleService.findByName(role.getName())).thenReturn(role); 
    when(passwordEncoder.encode(user.getPassword())).thenReturn("Encoded password"); 
    when(userService.save(user)).thenReturn(1L); 


    mockMvc.perform(MockMvcRequestBuilders.post("/user").content(user.toJson())).andDo(print()) 
      .andExpect(status().isOk()) 
      .andExpect(content().contentType("application/json")) 
      .andExpect(content().string(user.toJson())); 

} 

。私はUserService.save(user)のMockを実際のsave()と同じように、保存されたユーザのidを変更するように設定できますか? PasswordEncoderと同じですが、PasswordEncoder.encode(string)を呼び出すと、文字列の値がエンコードされた値に変更されます。

答えて

1

を作成するとき、すなわち、単にユーザIDを設定します。したがって、私はそれをお勧めしません。あなたの単体テストがSpringコントローラをテストしていて、UserServiceまたはPasswordEncoderをテストしておらず、SpringコントローラがユーザのIDが変更されたかどうか、またはパスワードがエンコードされているかどうかを確認する責任はありません。 userServicepasswordEncoderの両方が呼び出されたことを確認できますが、コントローラーのテストが行​​われる限りです。

ではなく、例えば、テストデータベースに、実際の授業で、エンドツーエンドのテストを実行し、あなたが本当にUserServicePasswordEncoderを嘲笑されていない何をしたいのかのように聞こえるが、。新しいユーザーをコントローラーからPOSTしてから、テストデータベースからフェッチし、得られた結果が正しいかどうかを確認することができます。このシナリオでは、Springコントローラをユニットテストするのではなく、実際のチェーン全体をテストします。

when(userService.save(user)).thenAnswer(new Answer<Long>() { 
    @Override 
    public Long answer(InvocationOnMock invocation) { 
     user.setId(1L); 
     return 1L; 
    } 
}); 

メソッドはモックに呼び出されると、このカスタム答えが呼び出されます:あなたはthenAnswer代わりのthenReturnを使用してカスタムの答えを設定することにより、求めているものを行うことができ、言っ

その結果は嘲笑されたメソッドによって返されます。ここでは、返す前にユーザーのIDも設定します。これはまだまだ恐ろしいことですが、適切な統合テストを行うことが非常に望ましいでしょう。

+0

ありがとう、ええと、私は完全性テストが好きです:) – zzheads

+0

ユーザーのidプロパティがsaveメソッド(mock)コントローラで呼び出されます。 "Real" save()はまったく違ったやり方で、user.idを "模擬"バージョンに設定できるものを見つけることはできません... – zzheads

1

ユニットテストで機能/統合テストではないと仮定すると、UserServiceUserを嘲笑しているなら、あなたはその動作を気にしないので、あなたはそれを "嘲笑"しています。つまり、以前に設定したUserまたはUserのモックを返すように伝えることができます。

あなたがこのテスト香りで、おそらくあなたはあまりテストされることを意味したくてUserオブジェクト

+0

合意しましたが、新しいユーザーが投稿(「/ユーザー」)を使用して作成されたときに、ユーザーのパスワードがエンコードされていることを確認する必要があります。どのように私はそれをチェックできますか? – zzheads

+1

私はあなたのアプリの完全な構造については分かりませんが、単体テストは1つのテストで1つのオブジェクトをテストしなければなりません。あなたが何かが呼び出されて何か他のものがパスワードをエンコードしている場合、そのテストは2つの別々のテストの候補です –

関連する問題