使用JUnit测试Tapestry页面和组件

时间:2010-08-27 09:07:15

标签: java testing junit tapestry

我通常尝试使用Selenium最小化测试并最大限度地使用普通的旧后端测试(JUnit,mocking)。使用Tapestry我发现很难用后一种方式测试页面和组件,因为回调函数会产生“魔力”。

你能解决这个问题吗?或者您只是将Selenium用于整个Web层(页面,组件)?

2 个答案:

答案 0 :(得分:3)

根据Tapestry文档,使用PageTester是对页面和组件进行单元测试的适当方法:http://tapestry.apache.org/tapestry5/guide/unit-testing-pages.html

但这似乎与HtmlUnit样式的Web测试相似,因为交互是通过类似于界面的Web浏览器而不是通过Page或Component的界面进行的。

修改

我刚尝试了一个简单的页面单元测试,它运行得很好:

public class FooPageTest extends AbstractServiceTest{

    @Autobuild
    @Inject
    private FooPage fooPage;

    @Test
    public void setupRender(){
        fooPage.setupRender();
    }

}

AbstractServiceTest提供了一个测试运行器,它为单元测试类提供Tapestry依赖注入。使用Autobuild,您可以获得FooPage的@Inject依赖关系,对于组件注入和@Property注释元素,您需要找出其他内容。

答案 1 :(得分:0)

就Timo的建议提出具体问题:

public class AbstractServiceTest
{
    @Before
    public void before() throws IllegalAccessException {
        // startupRegistry();
        injectServices();
    }

    private void injectServices() throws IllegalAccessException {
        for(Field field : getClass().getDeclaredFields()) {
            field.setAccessible(true);

            if(field.isAnnotationPresent(Inject.class)) 
                field.set(this, registry.getService(field.getType()));

            if(field.isAnnotationPresent(Autobuild.class))
                field.set(this, registry.autobuild(field.getType()));
        }
    }
}

然后,您将在测试中正确注入字段。记住@Inject服务(接口)和@Autobuild实现(类)