2

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

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

public class BarChart extends FlowPanel {

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

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

我尝试过 JUnit,但它需要是 GWTTestCase,因为该对象需要 GWT.create(),并且我尝试过反射,但 GWTTestCase 不支持它。

4

2 回答 2

7

我知道这不会是您正在寻找的答案,但是单元测试私有方法是不好的形式。

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

由于您提供的代码示例很短,很难提供具体的策略,但我可以就用例做一些一般性的陈述。

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

  1. 私有方法是不可达(死)代码
  2. 您正在测试的课程附近有一种设计气味;私有方法仍然应该对类有可观察的影响
  3. 您尝试测试的方法不应该是私有的;在这种情况下,也许改变方法的可见性是完全可以接受的。

此外,您可以使用GWT UIBinder将 UI 代码与应用程序逻辑分开。分离出 UI 后,您可以使用 JUnit 测试来测试剩余的代码。GWTTestcases 仅适用于需要 GWT.create(...) 并且它们运行非常缓慢(与 junit 相比)的类,因此最好构造代码,以便可以使用 junit 完成大部分测试,然后使用 gwttestcase覆盖其余部分。如果你能实现这种结构,那么它为使用 easymock/mockito/reflection 等进行测试开辟了额外的途径。

于 2013-04-11T19:28:23.847 回答
3

在 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);
}-*/;
于 2013-04-11T19:46:35.607 回答