Wicket AJAX单元测试单独通过,但在完整的测试套件中失败

时间:2015-11-14 18:50:56

标签: unit-testing wicket easymock

我有一个运行良好的测试类,当我运行整个软件包时,它会运行。但是,当我运行整个项目时,它在20个测试中失败了4个。

我正在使用Eclipse Juno SR1来运行测试,而我正在使用EasyMock 3.2。 (PowerMock也在项目设置中,但它仅用于模拟外部依赖项的两个测试中。)该项目使用Wicket 6.18在Java 7中。

我确定您需要更多信息,但我不知道从哪里开始,所以,如果您需要了解其他任何内容,请发表评论,我会(尝试)添加它。

以下是其中一个的失败消息:

junit.framework.AssertionFailedError: Missing expected feedback message: The value of 'percentage' must be between 0 and 100.

其他三个的失败消息也与缺少反馈消息有关。行为是确定性的。同一个测试类中的四个测试用例总是相同,但总是会出现相同的“缺少预期反馈”消息。

以下是其中一个测试用例:

@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();
}

1 个答案:

答案 0 :(得分:1)

我没有看到任何错误。尝试转储最后一个响应:System.err.println(“=== DEBUG ==== \ n \ n”+ getTester.getLastResponse()。getDocument());.检查TextField的值是什么以及为FeedbackPanel生成的内容是什么。