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 生成的内容是什么。