我是GWT / Java的新手,需要一些关于如何解决这个(似乎应该是)简单问题的想法。
我有一个GWT对象,我正在尝试测试私有方法:
public class BarChart extends FlowPanel {
public BarChart() {
super();
privateMethod();
}
privateMethod() {
//want to test this
}
}
我已经尝试过JUnit,但它需要是一个GWTTestCase,因为这个对象需要GWT.create(),我尝试过反射但GWTTestCase不支持它。
答案 0 :(得分:7)
我知道这不是你要找的答案,但单元测试私有方法是不好的形式。
您应该重构代码,以便可以通过公共API测试/观察私有方法的影响。
由于您提供的代码示例很短,因此难以提供特定策略,但我可以对用例做一些一般性陈述。
测试私有方法的最佳方法是通过另一种公共方法。如果无法做到这一点,则满足下列条件之一:
此外,您可以使用GWT UIBinder将UI代码与应用程序逻辑分开。一旦UI被分离出来,您就可以使用JUnit测试来测试剩余的代码。 GWTTestcases仅适用于需要GWT.create(...)的类,并且运行速度非常慢(与junit相比),因此最好构造代码,以便大多数测试可以使用junit完成,然后使用gwttestcase覆盖其余部分。如果你能够实现这种结构,那么它将为使用easymock / mockito / reflection等进行测试提供额外的途径。
答案 1 :(得分:2)
在GWT客户端(包括GWTTestCase)中,您可以使用JSNI调用私有或受保护的方法,这称为violator pattern
给定一个带私有方法的类
package com.example;
public class MyClass {
private MyObjectReturn myMethod(MyObjectParam param) {
return null
}
}
创建一个jsni方法并访问它
native MyObjectReturn myViolatorMethod(MyClass instance, MyObjectParam param) /*-{
return instance.@com.example.MyClass::myMethod(*)(param);
}-*/;