2016-12-21 8 views
0

Я тестирую приложение JSF (v2.2.14), но у меня есть некоторые трудности, потому что я не могу издеваться над классом UIViewRoot. Когда я пытаюсь издеваться этот класс с Mockito я получаю ошибкуКак издеваться над классом JSF UIViewRoot

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

я использую viewRoot для того, чтобы управлять java.util.Locale приложения и иногда мне нужно прочитать эту информацию.

В каком случае я могу издеваться над этим классом, чтобы продолжить свои тестовые примеры?

Спасибо!

+0

, пожалуйста, покажите код. –

+1

Почему вы пытаетесь высмеять API JSF? Вы не создаете реализацию JSF, а просто веб-приложение, использующее существующую реализацию JSF, верно? Вы не должны интересоваться тестированием используемой реализации JSF (поскольку достойные, как правило, уже хорошо протестированы), но ваша собственная реализация webapp (действительно, для этого требуется совершенно другой подход к тестированию). – BalusC

+0

Вы правы. Я не хочу тестировать JSF, и меня это не интересует. Я хочу проверить некоторые методы в некоторых контроллерах, содержащих такой код, как этот FacesContext.getCurrentInstance(). GetViewRoot(). GetLocale(). Больше ничего. – Gavi

ответ

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(); 
+0

Еще один способ подверженности ошибкам ... Использование aquillian или аналогичного является более безопасным. – Kukeltje

0

Если вы используете PowerMockito, вы можете использовать @SuppressStaticInitializationFor аннотацию, чтобы удалить статический инициализатор. https://github.com/powermock/powermock/wiki/SuppressUnwantedBehavior

Например, если код:

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

public class TestedClass 
{ 

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

Следующий тест будет проходить (JavaEE7, PowerMockito 1.6.4):

@RunWith(PowerMockRunner.class) 
    @SuppressStaticInitializationFor({"javax.faces.component.UIViewRoot", "javax.faces.component.UIComponent", "javax.faces.component.UIComponentBase"}) 
    @PrepareForTest({TestedClass.class, FacesContext.class, UIViewRoot.class, UIComponentBase.class, UIComponent.class, Locale.class}) 
    public class TestedClassTest { 

     private final FacesContext facesContext = Mockito.mock(FacesContext.class); 
     private final UIViewRoot uiViewRoot = Mockito.mock(UIViewRoot.class); 
     private final Locale locale = PowerMockito.mock(Locale.class); 

    private final TestedClass instance = new TestedClass(); 

    @Before 
    public void setUp() { 
     PowerMockito.mockStatic(FacesContext.class); 

    Mockito.when(FacesContext.getCurrentInstance()).thenReturn(facesContext); 

     Mockito.when(facesContext.getViewRoot()).thenReturn(uiViewRoot); 
     Mockito.when(uiViewRoot.getLocale()).thenReturn(locale); 
    } 

    /** 
    * Test of getLocale method, of class TestedClass. 
    */ 
    @Test 
    public void testGetLocale() { 

     assertEquals(locale, instance.getLocale()); 
    } 
} 

Убедитесь, что вы подавляете супер классов UIViewRoot также.

Смежные вопросы