【问题标题】:How to call a non static public method from a Singleton class which is using Google @Inject如何从使用 Google @Inject 的 Singleton 类调用非静态公共方法
【发布时间】:2015-09-18 13:38:19
【问题描述】:

我有一个要测试的单例类。它为该类的构造函数使用@Inject 注释。现在为了测试,我想在我的测试类中为该类调用一个公共方法,但无法这样做。我已经模拟了一个传递给构造函数的对象。

@Inject
    private SomeClass(SomeOtherClassObject obj) {
        super(obj);
    }

我用以下方式模拟了上面的私有构造函数:

Singleton mockSingleton = PowerMock.createMock(Singleton.class);
        PowerMock.expectNew(Singleton.class).andReturn(mockSingleton);

我不明白如何调用以下方法

public SomeClass someMethod(int 1, String 2){

//some logic

return (Object of SomeClass)
}

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 将构造函数设为私有是使您的类不可测试的最佳方式。使其至少受到包保护,以便测试可以调用构造函数。
  • 我明白,但我无法更改课程代码。我只需要测试它。有什么建议么?另外,我刚刚注意到当我尝试运行测试时出现错误,它给出的错误是构造函数不是预期的。如何将我拥有的模拟对象传递给我使用上述代码创建的构造函数?

标签: java unit-testing singleton guice


【解决方案1】:

如果您也使用 guice,您可以在测试中提供一个模块,将 SomeOtherClassObject 绑定到您的模拟实例。然后通过 Guice 的注入器创建 SomeClass 实例。

@Test
public void test() {
  SomeOtherClassObject other = ...; // what ever you need to create the Mock
  Injector injector = Guice.createInjector(new AbstractModule(){
    public void configure() {
      bind(SomeOtherClassObject.class)toInstance(other);
    }
   });
   SomeClass some = injector.getInstance(SomeClass.class); // guice takes care of the constructor injection
   some.someMethod(...);
  }

如果您不使用 guice,请查看 needle4j。它是一个测试支持库,可在需要注入时自动注入模拟。但它只适用于 easymock 或 mockito。

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多