GWTTestCase:测试私有方法

时间:2013-04-11 18:36:53

标签: java gwt reflection junit gwttestcase

我是GWT / Java的新手,需要一些关于如何解决这个(似乎应该是)简单问题的想法。

我有一个GWT对象,我正在尝试测试私有方法:

public class BarChart extends FlowPanel {

    public BarChart() {
        super();
        privateMethod();
    }

    privateMethod() { 
        //want to test this 
    }
}

我已经尝试过JUnit,但它需要是一个GWTTestCase,因为这个对象需要GWT.create(),我尝试过反射但GWTTestCase不支持它。

2 个答案:

答案 0 :(得分:7)

我知道这不是你要找的答案,但单元测试私有方法是不好的形式。

您应该重构代码,以便可以通过公共API测试/观察私有方法的影响。

由于您提供的代码示例很短,因此难以提供特定策略,但我可以对用例做一些一般性陈述。

测试私有方法的最佳方法是通过另一种公共方法。如果无法做到这一点,则满足下列条件之一:

  1. 私有方法无法访问(死机)代码
  2. 您正在测试的课程附近有一种设计气味;私有方法应该仍然对类
  3. 产生可观察的影响
  4. 您尝试测试的方法不应该是私有的;在这种情况下,也许完全可以接受改变方法的可见性。
  5. 此外,您可以使用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);
}-*/;