gpt4 book ai didi

java - 单元测试 ModalWindow 的内容刷新失败,而实际功能按预期工作 - 我做错了什么?

转载 作者:行者123 更新时间:2023-12-01 19:24:52 25 4
gpt4 key购买 nike

所以,我先花了几个小时尝试自己“修复”这个问题,然后像疯子一样在谷歌上搜索,但没有找到任何有帮助的东西,所以现在我在这里。

基本上,我在 Wicket 自己的 ModalWindow 中有一个自定义 Panel,并且由于我喜欢单元测试,所以我想测试它。这里的具体行为是刷新 ModalWindow 的内容:在我提取此内容的实际代码中,Ajax 事件处理实际上将新内容重新加载到内容面板,我只是删除了这些内容以使其更短。

所以,这是面板的代码

package wicket.components;

import org.apache.wicket.ajax.AjaxRequestTarget;

import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.*;

public class MyModalWindowPanel extends Panel {

private Form form;
private ModalWindow modal;

public MyModalWindowPanel(String id, ModalWindow modal) {
super(id);

this.setOutputMarkupId(true);
this.modal = modal;

initializeForm();
addBasicDataFieldsToForm();
add(campaignForm);
}

private void initializeForm() {
form = new Form("form");
form.setOutputMarkupId(true);
}

private void addBasicDataFieldsToForm() {
campaignForm.add(new AjaxButton("infoSubmit",
new Model<String>("Ajaxy Click")) {

protected void onSubmit(AjaxRequestTarget target, Form<?> form) {

modal.setContent(new MyModalWindowPanel(modal.getContentId(),
modal));

modal.show(target);
}
});
}
}

以及相应的标记

<wicket:panel>
<form wicket:id="form">
<input type="submit" value="Ajaxy Click" wicket:id="infoSubmit" />
</form>
</wicket:panel>

请注意,当在 Tomcat 等 servlet 容器中运行时,它可以正常工作 - 这里没有功能错误!

那么问题出在哪里呢?我似乎无法通过单元测试来使其发挥作用!我的面板测试类如下所示

package wicket.components;

import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.util.tester.*;
import junit.framework.TestCase;

public class MyModalWindowPanelTestCase extends TestCase {

private WicketTester tester;
private ModalWindow modal;

@Override
protected void setUp() throws Exception {
tester = new WicketTester();
modal = new ModalWindow("modal");

tester.startPanel(new TestPanelSource() {

public Panel getTestPanel(String id) {
return new MyModalWindowPanel(id, modal);
}
});
}

public void testReloadingPanelWorks() throws Exception {
// the next line fails!
tester.executeAjaxEvent("panel:campaignForm:campaignInfoSubmit",
"onclick");
tester.assertNoErrorMessage();
}
}

这是运行该命令的堆栈跟踪结果

java.lang.IllegalStateException: No Page found for component [MarkupContainer [Component id = modal]]
at org.apache.wicket.Component.getPage(Component.java:1763)
at org.apache.wicket.RequestCycle.urlFor(RequestCycle.java:872)
at org.apache.wicket.Component.urlFor(Component.java:3295)
at org.apache.wicket.behavior.AbstractAjaxBehavior.getCallbackUrl(AbstractAjaxBehavior.java:124)
at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.getCallbackScript(AbstractDefaultAjaxBehavior.java:118)
at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.getCallbackScript(AbstractDefaultAjaxBehavior.java:106)
at org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow$WindowClosedBehavior.getCallbackScript(ModalWindow.java:927)
at org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.getWindowOpenJavascript(ModalWindow.java:1087)
at org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.show(ModalWindow.java:352)
at wicket.components.MyModalWindowPanel$1.onSubmit(MyModalWindowPanel.java:45)
at org.apache.wicket.ajax.markup.html.form.AjaxButton$1.onSubmit(AjaxButton.java:102)
at org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:143)
at org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:177)
at org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:299)
at org.apache.wicket.util.tester.BaseWicketTester.executeAjaxEvent(BaseWicketTester.java:1236)
at org.apache.wicket.util.tester.BaseWicketTester.executeAjaxEvent(BaseWicketTester.java:1109)
at wicket.components.MyModalWindowPanelTestCase.testReloadingPanelWorks(MyModalWindowPanelPanelTestCase.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:168)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

那么,我该如何/应该修复我的单元测试以使其通过?

最佳答案

我要冒险说:将您的面板组件添加到页面进行测试..

据我所知,您无法测试单个组件,但应该通过获取页​​面并对其进行断言来设置测试..

这是我用于测试的:

public class TestHomePage {
private static WicketTester tester;

@BeforeClass
public static void setUp() {
tester = new WicketTester(new WicketApplication() {
@Override
protected void init() {
//Override init to use SpringUtil's SpringContext due to missing WebApplicationContext
addComponentInstantiationListener(new SpringComponentInjector(this, SpringUtil.getContext()));
}
});
}

@Test
public void testRenderMyPage() {
//start and render the test page
tester.startPage(HomePage.class);

//assert rendered page class
tester.assertRenderedPage(HomePage.class);

//assert page contents
tester.assertContains("Welcome to my webpage");
}
}

如有错误,请指正!

关于java - 单元测试 ModalWindow 的内容刷新失败,而实际功能按预期工作 - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1802975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com