【问题标题】:How to unit test and mock a method that takes a ModelAndView as Parameter如何对以 ModelAndView 作为参数的方法进行单元测试和模拟
【发布时间】:2015-11-19 07:47:45
【问题描述】:

我有一个名为

的 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的方法?

【问题讨论】:

  • 然后呢? ModelAndView 是接口吗?
  • 没有。 spring 提供的内置类。
  • 该代码无法编译。你不能测试它!你到底想测试什么?您尝试过什么,您的具体问题是什么?
  • @user714965 谢谢你指出。代码中有错误。更正并更新了它。
  • @user714965 我想测试当一个modelAndView被传递到方法verifyParameters时,当一个不正确的userName被传递时它会向modelAndView添加一个对象。我想断言它与 i18n 文件中的字符串相同。

标签: java unit-testing spring-mvc mocking


【解决方案1】:

我为你编写了一个单元测试。我正在使用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"));
}

【讨论】:

  • 谢谢。这是完美的。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多