如何使用 JUnit 测试显示消息的 FacesContext
How to test FacesContext showing a message with JUnit
abort()-方法:
public void abort() {
LOG.info("some-text");
warning("some-text");
}
警告()-方法:
public void warning(String message) {
FacesContext.getCurrentInstance()
.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "INFO:", message));
}
我想写一个 Test-Case 用于中止,它只是验证没有任何改变,第二个 Test-Case 正在验证 warning()工作中。
我知道这两个小方法不需要 Unit-Test 但我想知道它是否可能。 UI-Test 用于显示 p:message 运行良好,但我想之前通过 Unittest 检查标题、类型和消息,因为它 运行 快得多。
仅使用 JUnit 4.11 的工作解决方案
将 warning() 中的内容单独 class 像这样:
@Named
@RequestScoped
public class Resources {
@Produces
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
接下来您需要定义一个 ArgumentCaptor,它可以为您的 JUnit 测试捕获 FacesMessage。我将其创建为 clss 成员,它将在 @before 部分中初始化并在 @teardown 中获取空值。
private ArgumentCaptor<FacesMessage> facesMessageCaptor;
@Before
public void setUp() {facesMessageCaptor = ArgumentCaptor
.forClass(FacesMessage.class);
}
@After
public void tearDown() { facesMessageCaptor = null; }
现在你只需要在你的测试中添加两个@Mocks-class
@Mock
Resources resourcesMock;
@Mock
FacesContext facesContextMock;
所以你做到了!像这样写测试:
Mockito.doReturn(facesContextMock).when(resourcesMock).produceFacesContext();
// Execute Method
cut.warning("SOME_DETAIL_TEXT");
// Verify interactions with the Resources and Faces and maybe others...
verify(resourcesMock).produceFacesContext();
verify(facesContextMock).addMessage(Mockito.anyString() ,
facesMessageCaptor.capture());
verifyNoMoreInteractions(...., resourcesMock, facesContextMock);
// write assert (i´ve used hamcrast-corematchers - more readable)
actualMessage = (FacesMessage) facesMessageCaptor.getValue();
assertThat(FacesMessage.SEVERITY_WARN, is(equalTo(actualMessage.getSeverity())));
assertThat(MY_TITLE, is(equalTo(actualMessage.getSummary())));
assertThat("DETAIL_TEXT", is(equalTo(actualMessage.getDetail())));
abort()-方法:
public void abort() {
LOG.info("some-text");
warning("some-text");
}
警告()-方法:
public void warning(String message) {
FacesContext.getCurrentInstance()
.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "INFO:", message));
}
我想写一个 Test-Case 用于中止,它只是验证没有任何改变,第二个 Test-Case 正在验证 warning()工作中。 我知道这两个小方法不需要 Unit-Test 但我想知道它是否可能。 UI-Test 用于显示 p:message 运行良好,但我想之前通过 Unittest 检查标题、类型和消息,因为它 运行 快得多。
仅使用 JUnit 4.11 的工作解决方案
将 warning() 中的内容单独 class 像这样:
@Named
@RequestScoped
public class Resources {
@Produces
public FacesContext produceFacesContext() {
return FacesContext.getCurrentInstance();
}
}
接下来您需要定义一个 ArgumentCaptor,它可以为您的 JUnit 测试捕获 FacesMessage。我将其创建为 clss 成员,它将在 @before 部分中初始化并在 @teardown 中获取空值。
private ArgumentCaptor<FacesMessage> facesMessageCaptor;
@Before
public void setUp() {facesMessageCaptor = ArgumentCaptor
.forClass(FacesMessage.class);
}
@After
public void tearDown() { facesMessageCaptor = null; }
现在你只需要在你的测试中添加两个@Mocks-class
@Mock
Resources resourcesMock;
@Mock
FacesContext facesContextMock;
所以你做到了!像这样写测试:
Mockito.doReturn(facesContextMock).when(resourcesMock).produceFacesContext();
// Execute Method
cut.warning("SOME_DETAIL_TEXT");
// Verify interactions with the Resources and Faces and maybe others...
verify(resourcesMock).produceFacesContext();
verify(facesContextMock).addMessage(Mockito.anyString() ,
facesMessageCaptor.capture());
verifyNoMoreInteractions(...., resourcesMock, facesContextMock);
// write assert (i´ve used hamcrast-corematchers - more readable)
actualMessage = (FacesMessage) facesMessageCaptor.getValue();
assertThat(FacesMessage.SEVERITY_WARN, is(equalTo(actualMessage.getSeverity())));
assertThat(MY_TITLE, is(equalTo(actualMessage.getSummary())));
assertThat("DETAIL_TEXT", is(equalTo(actualMessage.getDetail())));