如何模拟JSF类UIViewRoot

时间:2016-12-21 15:31:15

标签: java unit-testing jsf mockito jsf-2.2

我正在测试我的JSF应用程序(v2.2.14),但是我遇到了一些困难,因为我无法模拟UIViewRoot类。 当我尝试用Mockito模拟这个类时,我收到错误

java.lang.ExceptionInInitializerError 
...
...
caused by java.util.MissingResourceException: Can't find javax.faces.LogStrings bundle

我使用viewRoot来管理应用程序的java.util.Locale,有时我需要阅读这些信息。

我可以通过哪种方式模拟这个类以继续我的测试用例?

谢谢!

2 个答案:

答案 0 :(得分:0)

目前我已将所有依赖JSF的代码包装在一个现在我可以轻松模拟的类中。

@Component
public class FacesComponent implements Serializable {

    public Locale getLocaleFromFrontend() {
        return FacesContext.getCurrentInstance().getViewRoot().getLocale();
    }
}

然后我的测试类与此类似

    @Autowired
    @InjectMocks
    private LocalDateConverter localDateConverter;

    @Autowired
    @Spy
    private FacesComponent facesComponent;
...
...
MockitoAnnotations.initMocks(this);
Mockito.doReturn(null).when(facesComponent).getLocaleFromFrontend();

答案 1 :(得分:0)

如果使用PowerMockito,则可以使用@SuppressStaticInitializationFor注释删除静态初始值设定项。 https://github.com/powermock/powermock/wiki/SuppressUnwantedBehavior

例如,如果代码是:

object.attr1

以下测试将通过(JavaEE7,PowerMockito 1.6.4):

import java.util.Locale;
import javax.faces.context.FacesContext;

public class TestedClass
{

  public Locale getLocale()
  {
    return FacesContext.getCurrentInstance().getViewRoot().getLocale();
  }
}

确保你也压制UIViewRoot的超类。