如何从使用Google @Inject的Singleton类调用非静态公共方法

时间:2015-09-18 13:38:19

标签: java unit-testing singleton guice

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

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)
}

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

:

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

1 个答案:

答案 0 :(得分: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。