2

次のコントローラーがあり、Junit テストを作成したいのですが、

@RequestMapping(value = "/path", method = RequestMethod.Get)
public String getMyPath(HttpServletRequest request, Model model) {

    Principal principal = request.getUserPrincipal();
    if (principal != null) {
        model.addAttribute("username", principal.getName());
    }
    return "view";
}

JUnit メソッドは次のようになります。

@Test
public void testGetMyPath() throws Exception {

    when(principalMock.getName()).thenReturn("someName");

    this.mockMvc.perform(get("/path")).andExpect(status().isOk());
}

principalMock は次のように宣言されます。

@Mock
private Principal principalMock;

問題は、プリンシパルで getName() メソッドを呼び出すと、この行で NullPointerException が発生することです。

model.addAttribute("username", principal.getName());
4

1 に答える 1

1

プリンシパルのモックは、どこにも影響を与えることができないため、まったく効果がありません (コントローラーは、プリンシパルを生成するために注入された依存関係を使用していませんが、HttpServletRequest を使用しています)。

テストを次のように変更する必要があります。

this.mockMvc.perform(get("/path").principal(principalMock)).andExpect(status().isOk());

モック プリンシパルがMockHttpServletRequest実際にコントローラー メソッドに渡されるため、これは機能します。

于 2014-05-16T13:31:54.943 に答える