为什么字段注入导致类很难测试



根据Google I/O 2009-Big Modular Java with Guice(29:55),使用字段注入比构造函数或setter注入更难进行测试。

让我们考虑一下新闻服务类:

public class NewsService{
    @Inject Storage storage;
    @Inject Authenticator auth;
    public void addNews(String data){
       if(auth.authenticate()){
          storage.save(data);
       }
    }
}

和新闻服务单元测试:

@RunWith(MockitoJunitRunner.class)
public class NewsServiceTest{
    @Mock Storage storage;
    @Mock Authenticator auth;
    @InjectMocks NewsService sut; //system under test
    @Test
    public void addNews_ShouldCallSaveOnStorage_WhenAuthIsSucceed(){
       when(auth.authenticate()).thenReturn(true);
       sut.addNews("mocked data");
       verify(storage).save("mocked data");
    }
}

Mockito甚至可以将mock注入私有字段。注意封装很重要,所以我使用包可见性。即使Storage和Authenticator类与NewsService在不同的包中,并且它们仍然对自己的字段使用包可见性,我也不在乎,因为NewsService不必访问Storage或Authenticator的任何字段,因为我嘲笑了它们的行为

即使我将NewsService更改为使用构造函数注入,我的单元测试类也不会更改

所以问题是:在保持设计良好的体系结构的情况下,字段注入真的会导致测试更加困难吗?

字段注入更困难,因为必然涉及反射;例如,如果使用构造函数注入测试类,只需创建mock依赖项并将其传递给new。直接在私人领域写作需要大量的簿记。

然而,请注意,这种说法已经有四年多的历史了。正如您所展示的,从那时起,用于依赖注入的工具(用于测试和生产)已经取得了长足的进步,@Inject现在是Java的官方标准。您可以使用测试框架为自己处理所有反射,并轻松地测试具有注入依赖关系的对象。

相关内容

  • 没有找到相关文章