Unit testing 如何单元测试具有字段注入的类(使用guice)

Unit testing 如何单元测试具有字段注入的类(使用guice),unit-testing,dependency-injection,junit4,guice,Unit Testing,Dependency Injection,Junit4,Guice,测试中的类如下所示: public class SomeAdapter { @Inject HttpService httpService; @Inject Configuration configuration; public SomeAdapter() { GuiceInjector.getInjector().injectMembers(this); } public String getBaseUrl() { return configuration.getPro

测试中的类如下所示:

public class SomeAdapter {

@Inject
HttpService httpService;

@Inject
Configuration configuration;

public SomeAdapter()
{
    GuiceInjector.getInjector().injectMembers(this);
}

public String getBaseUrl()
{
    return configuration.getProtocol()+ "://" + some.getServer() + ":" + configuration.getPort();
  }
}

我尝试过从mockito框架中注入Mock,但它似乎不可靠。是否有必要创建一个扩展AbstractModule的独立测试模块?

我建议在类之外注入依赖项(这将遵循单一责任原则)。然后您可以使用标准Mockito:

@RunWith(MockitoJUnitRunner.class)
public class SomeAdaptorTest {

  @Inject
  Configuration configuration;

  @InjectMocks
  SomeAdaptor adaptor = new SomeAdaptor();

  @Before
  public void setUp() {
    when(configuration.getId()).thenReturn(5);
  }
  ...

或者创建另一个构造函数package private来接受模拟依赖项。

被测试的类误用了Guice API(它不应该出现在生产类中的任何地方)。如果构造函数中的代码被删除,那么该类应该可以使用任何支持注入模拟依赖项的模拟库(如EasyMock、Mockito或JMockit)进行测试。@Rogério,那么您的意思是,“GuiceInjector.getInjector().injectMembers(this)”不能出现在构造函数中吗?是的,因为依赖项注入的整个要点是将负责实例化类依赖项的代码/配置移动到某个单独的外部实体(DI框架/容器,以及DI配置文件或类,在Guice的例子中是“模块”)。生产类本身最多应该包含元数据注释,例如
@Inject