如何单元测试并模拟将ModelAndView作为参数

时间:2015-11-19 07:47:46

标签: java unit-testing spring-mvc mocking

我有一个名为

的i18n属性文件
MessagesBundle_en.properties

invalidresourceBundle = Default locale English
invalidUserName = UserName cannot be null or empty or blank string

我有一个名为ParameterVerify的类来验证参数。

public class ParameterVerify {

    public void verifyParameters(String userName, ModelAndView modelAndView, ResourceBundle resourceBundle) {

        if (resourceBundle == null) {
            resourceBundle = ResourceBundle.getBundle("MessagesBundle", Locale.ENGLISH);
        }

        if (!(verifyParameter(userName))) {
            modelAndView.addObject("invalidUserName", resourceBundle.getString("invalidUserName"));
        }
    }

    private boolean verifyParameter(final String parameter) {
        if (!(StringUtils.isBlank(parameter))) {
            return true;
        } else {
            return false;
        }
    }
}

如何测试和模拟类ParameterVerify的方法?

1 个答案:

答案 0 :(得分:2)

我已经为你攻击了一个单元测试。我正在使用MockitoModelAndView创建模拟。由于ResourceBundle方法为getString(),因此无法模拟final。所以我使用dummy implementation来操纵返回值。如果你有很多这些测试,你最好将ResourceBundle包装在一个可模拟的类中并传递它。但是等等......您不需要模拟或存根RessourceBundle,因为您可以使用真实的.properties文件并在此处传递null

我写这个测试只是为了让你了解它是如何工作的。

@Test
public void test() {
    String userName = null; // should add message
    ModelAndView modelAndView = Mockito.mock(ModelAndView.class);
    ResourceBundle resourceBundle = new ResourceBundle() {
        @Override
        protected Object handleGetObject(String key) {
            if ("invalidUserName".equals(key)) {
                return "mocked_string";
            }
            return null;
        }

        @Override
        public Enumeration<String> getKeys() {
            return Collections.emptyEnumeration();
        }
    };

    ParameterVerify parameterVerify = new ParameterVerify();
    parameterVerify.verifyParameters(userName, modelAndView, resourceBundle);
    Mockito.verify(modelAndView, Mockito.times(1)).addObject(Mockito.eq("invalidUserName"), Mockito.eq("mocked_string"));
}

最好使用真实的MessagesBundle_en.properties文件作为测试资源:

@Test
public void test() {
    String userName = null; // should add message
    ModelAndView modelAndView = Mockito.mock(ModelAndView.class);
    ResourceBundle resourceBundle = null;

    ParameterVerify parameterVerify = new ParameterVerify();
    parameterVerify.verifyParameters(userName, modelAndView, resourceBundle);
    Mockito.verify(modelAndView, Mockito.times(1)).addObject(Mockito.eq("invalidUserName"), Mockito.eq("UserName cannot be null or empty or blank string"));
}