Как использовать mockito для насмешки FaceContext? - PullRequest
1 голос
/ 07 января 2011

Как мне смоделировать facecontext с помощью mockito?

Я сделал этот фиктивный метод:

public String toPage2(){  
    if(isChecked()){  
        return NAV_STRING;  
    } else {  
        FacesContext context = FacesContext.getCurrentInstance();  
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sæt i kryds checkboxen", null));  
        return "";  
    }  
}  

Когда я запускаю свой тест JUnit, я получаю исключение nullpointer, когда я вызываю getCurrentInstance ().

Как мне смоделировать FaceContext и написать тест, чтобы увидеть, если было добавлено сообщение Faces?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 10 апреля 2015

Вы можете попробовать использовать MockFacesContext от myfaces.Это очень удобный способ.

2 голосов
/ 14 января 2011

Либо введите FacesContext.setCurrentInstance() (некрасиво), либо не используйте статический метод.

Если вы не можете изменить статический метод, оберните его чем-то другим, например FacesContextProvider, который вызывает этот метод. Зависимость - внедрить провайдера. Тогда вы можете посмеяться над этим.

public MyClass(FacesContextProvider facesContextProvider) {
    this.facesContextProvider = facesContextProvider;
}

public String toPage2(){  
    if(isChecked()){  
        return NAV_STRING;  
    } else {  

        // Calls FacesContext.GetCurrentInstance() under the hood

        FacesContext context = facesContextProvider.getCurrentInstance();  
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Sæt i kryds checkboxen", null));  
        return "";  
    }  
}  
0 голосов
/ 31 мая 2016

when() требует аргумент, который должен быть «вызовом метода для макета».Например:

when(mock.getArticles()).thenReturn(articles);

Кроме того, эта ошибка может отображаться, потому что:

  1. вы задаете любой из: final / private / equals() / hashCode()методы.Эти методы не могут быть проверены / проверены.Методы насмешки, объявленные в закрытых родительских классах, не поддерживаются.
  2. внутри when() метод вызывается не в макете, а в другом объекте.
0 голосов
/ 26 мая 2015

Я знаю, что это старый вопрос, но нахожу свой ответ полезным.

Я всегда использую отдельный метод, который переопределяю с помощью макета, чтобы высмеивать FaceContext.

Например:

BackingBean:

public void useFacesContext() {
   findCurrentFacesContext().addMessage("clientId", facesMessage);
}

FacesContext findCurrentFacesContext() {
   return FacesContext.getCurrentInstance();
}

Тест:

private BackingBean backingBean;

@Mock
private FacesContext facesContext;

@Before
public void init() {
  backingBean = new BackingBean() {
      @Override
      FacesContext findCurrentFacesContext() {
        return facescontext;
      }
  };
}
0 голосов
/ 09 ноября 2014

Вы можете использовать, например, PowerMock , который является структурой, которая позволяет расширять библиотеки-макеты, например Mockito , с дополнительными возможностями В этом случае это позволяет вам высмеивать статические методы FacesContext.

Используя метод Mockito verify(), вы можете убедиться, что был вызван метод addMessage(). Кроме того, вы можете использовать ArgumentCaptor для извлечения FacesMessage, переданного вызову метода addMessage() на FacesContext.

@Test
public void testToPage2NotChecked() {
    // mock all static methods of FacesContext
    PowerMockito.mockStatic(FacesContext.class);

    FacesContext facesContext = mock(FacesContext.class);
    when(FacesContext.getCurrentInstance()).thenReturn(facesContext);

    NavigationBean navigationBean = new NavigationBean();
    navigationBean.setCheck(false);

    // check the returned value of the toPage2() method
    assertEquals("", navigationBean.toPage2());

    // create an ArgumentCaptor for the FacesMessage that will be added to
    // the FacesContext
    ArgumentCaptor<FacesMessage> facesMessageCaptor = ArgumentCaptor
            .forClass(FacesMessage.class);
    // verify if the call to addMessage() was made and capture the
    // FacesMessage that was passed
    verify(facesContext).addMessage(Mockito.anyString(),
            facesMessageCaptor.capture());

    // get the captured FacesMessage and check the set values
    FacesMessage message = facesMessageCaptor.getValue();
    assertEquals(FacesMessage.SEVERITY_INFO, message.getSeverity());
    assertEquals("Sæt i kryds checkboxen", message.getSummary());
}

Я создал сообщение в блоге , в котором более подробно объясняется приведенный выше пример кода.

...