1

Mockitoを使用してSpringコントローラーをテストしようとしていますが、すべてを@Mockにしないと、実際にどのようにテストできるかを知ることができません。さらに、テストメソッドはNullPointerExceptionを返します。これは、ユーザーを認識できず、実際にはユーザーロールをまったく認識できないためです。どういうわけか私のコントローラーをテストする方法はありますか?

(コントローラークラス)

@Controller
@SessionAttributes("user")
@RequestMapping("/login.htm")
public class LoginController{

    @Autowired
    private UserDao userDao;
    @Autowired
    private LoginValidator loginValidator;

    public LoginValidator getLoginValidator() {
        return loginValidator;
    }

    public void setLoginValidator(LoginValidator loginValidator) {
        this.loginValidator = loginValidator;
    }

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @RequestMapping(method = RequestMethod.GET)
    public String getSendEmptyForm(ModelMap model, HttpServletRequest req) {
        req.getSession().invalidate();
        model.addAttribute("loginForm", new LoginForm());
        return "login";
    }

    @RequestMapping(method = RequestMethod.POST)
    public String postSubmittedForm(ModelMap model, @ModelAttribute("loginForm") LoginForm loginForm,
            BindingResult result, SessionStatus status) {
        //validate form
        loginValidator.validate(loginForm, result);

        if (result.hasErrors()) {
            return "login";
        } 

        User user = userDao.findByLogin(loginForm.getLogin());
        model.addAttribute("user", user);

        if (user.getRole().getName().equals("Admin")) {
            model.addAttribute("usersList", userDao.findAll());
            return "viewAllUsersPage";
        } 

        if (user.getRole().getName().equals("User")){
            return "userPage";
        }

        model.addAttribute("error", "Your role is not User or Admin");
        return "errorPage";
    }

}

そして私のテストクラス

@RunWith(MockitoJUnitRunner.class) 
public class LoginControllerTest {

    @InjectMocks
    private LoginController controllerUT = new LoginController();

    @Mock
    private ModelMap model;

    @Mock
    private LoginForm loginForm;

    @Mock
    private BindingResult result;

    @Mock
    private SessionStatus status;

    @Mock
    private LoginValidator validator;

    @Mock
    private UserDao userDao;

    @Mock
    private User useк;

    @Test
    public void testSendRedirect(){
        final String target = "login";
        String nextPage = controllerUT.postSubmittedForm(model, loginForm, result, status);
        assertEquals(target, nextPage);
    }

}
4

1 に答える 1

3

loginForm.getLogin()まず、 anduserDao.findByLogin(loginForm.getLogin())およびのスタブが欠落しているようですuser.getRole().getName()。このようなスタブがない場合、モックで呼び出されたこれらのメソッドはデフォルト値 (つまりnull) を返します。

したがって、次を追加することをお勧めします。

when(loginForm.getLogin()).thenReturn(login);
when(userDao.findByLogin(login)).thenReturn(user);
when(user.getRole()).thenReturn(role);
when(role.getName()).thenReturn("Admin");

テストごとに戻り値を変えたいと思うでしょう。User と Role の実装クラスによっては、単純に実際のインスタンスを提供できます。結果をシミュレートしてエラーが発生するテストでは、このスタブを追加する必要があります。

when(result.hasErrors()).thenReturn(true);

それ以外の場合はデフォルトfalseが返されます。

于 2013-02-25T20:46:32.367 に答える