Wicket AJAX 单元测试自行通过但在完整测试套件中失败
Wicket AJAX unit test passes on its own but fails in the full test suite
我有一个测试 class,它 运行 本身很好,当我 运行 整个包都在里面时。但是,它在 20 次测试中有 4 次失败当我 运行 整个项目时。
我正在使用 Eclipse Juno SR1 运行 进行测试,并且我正在使用 EasyMock 3.2。 (PowerMock 也在项目设置中,但它仅用于两个特别需要模拟外部依赖项的测试。)该项目在 Java 7 中,使用 Wicket 6.18。
我确定您需要更多信息,但我不知道从哪里开始,所以如果您需要了解其他任何信息,请发表评论,我会(尝试)添加。
这是其中之一的失败消息:
junit.framework.AssertionFailedError: Missing expected feedback message: The value of 'percentage' must be between 0 and 100.
其他三个的失败消息也与缺少反馈消息有关。行为是确定性的。失败的总是同一测试 class 中的相同四个测试用例,总是带有相同的 "missing expected feedback" 消息。
这是测试用例之一:
@Test
public void testPercentageTooLarge() {
UserApplication u = new UserApplication();
setUser(u);
IEditIntervalDTOFrontEnd mockModel = createStrictMock(IEditIntervalDTOFrontEnd.class);
expect(mockModel.getLowerBound()).andReturn(BigDecimal.ZERO);
expect(mockModel.getUpperBound()).andReturn(BigDecimal.ZERO);
expect(mockModel.isLast()).andReturn(false);
expect(mockModel.getLowerLimit()).andReturn(BigDecimal.ZERO);
expect(mockModel.getUpperLimit()).andReturn(BigDecimal.ZERO);
expect(mockModel.getPercentage()).andReturn(new BigDecimal("3"));
replayAll();
EditIntervalPanel p = new EditIntervalPanel("test", new Model<IEditIntervalDTOFrontEnd>(mockModel));
startTest(p, false);
replay(getTarget());
@SuppressWarnings("unchecked")
TextField<BigDecimal> t = (TextField<BigDecimal>)getTester().getComponentFromLastRenderedPage(p.getPageRelativePath() + ":form:percentageContainer:percentage");
getTester().getRequest().getPostParameters().setParameterValue(t.getInputName(), "500");
getTester().executeAjaxEvent(t.getPageRelativePath(), "onchange");
verifyAll();
getTester().assertComponentOnAjaxResponse(p.getPageRelativePath() + ":form:errorPanel");
getTester().assertComponent(p.getPageRelativePath() + ":form:errorPanel", BootstrapFeedbackPanel.class);
getTester().assertFeedback(p.getPageRelativePath() + ":form:errorPanel", "The value of 'percentage' must be between 0 and 100.");
}
其他三个类似。他们将无效值注入请求参数,然后调用 AJAX onchange
事件。
这是正在测试的部分组件:
TextField<BigDecimal> percentage = new TextField<BigDecimal>("percentage", new PropertyModel<BigDecimal>(getModel(), "percentage"));
percentage.setRequired(true);
percentage.add(new RangeValidator<BigDecimal>(BigDecimal.ZERO, new BigDecimal(100)));
form.add(new WebMarkupContainer("percentageContainer").add(percentage));
percentage.add(new AjaxFormComponentUpdatingBehavior("onChange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
try {
if (!getModelObject().isNew()) {
getModelObject().execAndSync(((TemplatePage)getPage()).getLoggedInUser());
notifyChanged(target);
}
} catch (DTOFrontEndException e) {
logger.error(e.getMessage(), e);
throw new WicketRuntimeException(e.getMessage(), e);
}
target.add(errorPanel);
}
@Override
protected void onError(AjaxRequestTarget target, RuntimeException e) {
target.add(errorPanel);
}
});
这是被模拟的接口,以防出于某种原因它有帮助:
public interface IEditIntervalDTOFrontEnd extends IDTOFrontEnd {
BigDecimal getLowerBound();
BigDecimal getLowerLimit();
BigDecimal getUpperLimit();
BigDecimal getUpperBound();
BigDecimal getPercentage();
boolean isLast();
boolean isNew();
void setUpperLimit(BigDecimal value);
void setPercentage(BigDecimal value);
boolean isWellOrdered();
void reorder(IEditIntervalDTOFrontEnd prev, IEditIntervalDTOFrontEnd next);
boolean isChanged();
}
我没有发现任何问题。尝试转储最后一个响应:System.err.println("===DEBUG====\n\n" + getTester.getLastResponse().getDocument());。检查 TextField 的值是什么以及为 FeedbackPanel 生成的内容是什么。
我有一个测试 class,它 运行 本身很好,当我 运行 整个包都在里面时。但是,它在 20 次测试中有 4 次失败当我 运行 整个项目时。
我正在使用 Eclipse Juno SR1 运行 进行测试,并且我正在使用 EasyMock 3.2。 (PowerMock 也在项目设置中,但它仅用于两个特别需要模拟外部依赖项的测试。)该项目在 Java 7 中,使用 Wicket 6.18。
我确定您需要更多信息,但我不知道从哪里开始,所以如果您需要了解其他任何信息,请发表评论,我会(尝试)添加。
这是其中之一的失败消息:
junit.framework.AssertionFailedError: Missing expected feedback message: The value of 'percentage' must be between 0 and 100.
其他三个的失败消息也与缺少反馈消息有关。行为是确定性的。失败的总是同一测试 class 中的相同四个测试用例,总是带有相同的 "missing expected feedback" 消息。
这是测试用例之一:
@Test
public void testPercentageTooLarge() {
UserApplication u = new UserApplication();
setUser(u);
IEditIntervalDTOFrontEnd mockModel = createStrictMock(IEditIntervalDTOFrontEnd.class);
expect(mockModel.getLowerBound()).andReturn(BigDecimal.ZERO);
expect(mockModel.getUpperBound()).andReturn(BigDecimal.ZERO);
expect(mockModel.isLast()).andReturn(false);
expect(mockModel.getLowerLimit()).andReturn(BigDecimal.ZERO);
expect(mockModel.getUpperLimit()).andReturn(BigDecimal.ZERO);
expect(mockModel.getPercentage()).andReturn(new BigDecimal("3"));
replayAll();
EditIntervalPanel p = new EditIntervalPanel("test", new Model<IEditIntervalDTOFrontEnd>(mockModel));
startTest(p, false);
replay(getTarget());
@SuppressWarnings("unchecked")
TextField<BigDecimal> t = (TextField<BigDecimal>)getTester().getComponentFromLastRenderedPage(p.getPageRelativePath() + ":form:percentageContainer:percentage");
getTester().getRequest().getPostParameters().setParameterValue(t.getInputName(), "500");
getTester().executeAjaxEvent(t.getPageRelativePath(), "onchange");
verifyAll();
getTester().assertComponentOnAjaxResponse(p.getPageRelativePath() + ":form:errorPanel");
getTester().assertComponent(p.getPageRelativePath() + ":form:errorPanel", BootstrapFeedbackPanel.class);
getTester().assertFeedback(p.getPageRelativePath() + ":form:errorPanel", "The value of 'percentage' must be between 0 and 100.");
}
其他三个类似。他们将无效值注入请求参数,然后调用 AJAX onchange
事件。
这是正在测试的部分组件:
TextField<BigDecimal> percentage = new TextField<BigDecimal>("percentage", new PropertyModel<BigDecimal>(getModel(), "percentage"));
percentage.setRequired(true);
percentage.add(new RangeValidator<BigDecimal>(BigDecimal.ZERO, new BigDecimal(100)));
form.add(new WebMarkupContainer("percentageContainer").add(percentage));
percentage.add(new AjaxFormComponentUpdatingBehavior("onChange") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
try {
if (!getModelObject().isNew()) {
getModelObject().execAndSync(((TemplatePage)getPage()).getLoggedInUser());
notifyChanged(target);
}
} catch (DTOFrontEndException e) {
logger.error(e.getMessage(), e);
throw new WicketRuntimeException(e.getMessage(), e);
}
target.add(errorPanel);
}
@Override
protected void onError(AjaxRequestTarget target, RuntimeException e) {
target.add(errorPanel);
}
});
这是被模拟的接口,以防出于某种原因它有帮助:
public interface IEditIntervalDTOFrontEnd extends IDTOFrontEnd {
BigDecimal getLowerBound();
BigDecimal getLowerLimit();
BigDecimal getUpperLimit();
BigDecimal getUpperBound();
BigDecimal getPercentage();
boolean isLast();
boolean isNew();
void setUpperLimit(BigDecimal value);
void setPercentage(BigDecimal value);
boolean isWellOrdered();
void reorder(IEditIntervalDTOFrontEnd prev, IEditIntervalDTOFrontEnd next);
boolean isChanged();
}
我没有发现任何问题。尝试转储最后一个响应:System.err.println("===DEBUG====\n\n" + getTester.getLastResponse().getDocument());。检查 TextField 的值是什么以及为 FeedbackPanel 生成的内容是什么。