簡體   English   中英

我如何測試Guice注射?

[英]How do I test Guice injections?

我向Google Guice提供了連接我的對象的責任。 但是,我如何測試綁定是否運行良好?

例如,假設我們有一個具有依賴關系B A類。 如何測試B是否正確注入?

class A {
    private B b;
    public A() {}

    @Inject
    public void setB(B b) {
        this.b = b
    }
}

請注意, A沒有getB()方法,我想斷言Ab不是null

對於任何復雜的Guice項目,您應該添加測試以確保可以使用這些模塊來創建類。 在你的例子中,如果B是Guice無法弄清楚如何創建的類型,那么Guice將無法創建A.如果不需要A來啟動服務器但是在服務器處理時需要請求,這會導致問題。

在我的項目中,我為非平凡模塊編寫測試。 對於每個模塊,我使用requireBinding()來聲明模塊需要但不定義的綁定。 在我的測試中,我使用被測模塊創建了一個Guice注入器,另一個模塊提供了所需的綁定。 這是使用JUnit4和JMock的示例:

/** Module that provides LoginService */
public class LoginServiceModule extends AbstractModule {
  @Override 
  protected void configure() {
    requireBinding(UserDao.class);
  }

  @Provides
  LoginService provideLoginService(UserDao dao) {
    ...
  }
}

@RunWith(JMock.class)
public class LoginServiceModuleTest {
  private final Mockery context = new Mockery();

  @Test
  public void testModule() {
    Injector injector = Guice.createInjector(
        new LoginServiceModule(), new ModuleDeps());

    // next line will throw an exception if dependencies missing
    injector.getProvider(LoginService.class);
  }

  private class ModuleDeps extends AbstractModule {
    private final UserDao fakeUserDao;

    public ModuleDeps() {
      fakeUserDao = context.mock(UserDao.class);
    }

    @Override 
    protected void configure() {}

    @Provides
    Server provideUserDao() {
      return fakeUserDao;
    }
  }
}

請注意測試僅詢問提供者。 這足以確定Guice可以解決綁定問題。 如果LoginService是由提供程序方法創建的,則此測試不會測試提供程序方法中的代碼。

此測試也不會測試您是否將正確的內容綁定到UserDao ,或者UserDao范圍是否正確。 有人會爭辯說,那些類型的東西很少值得檢查; 如果有問題,它會發生一次。 你應該“測試,直到恐懼變成無聊。”

我發現模塊測試很有用,因為我經常添加新的注入點,並且很容易忘記添加綁定。

requireBinding()調用可以幫助Guice在返回注入器之前捕獲缺失的綁定! 在上面的例子中,如果requireBinding()調用不存在,測試仍然可以工作,但我喜歡它們,因為它們用作文檔。

對於更復雜的模塊(比如我的根模塊),我可能會使用Modules.override()來覆蓋我在測試時不想要的綁定(例如,如果我想驗證我的根對象是否要創建,我可能不會不希望它創建一個將連接到數據庫的對象。 對於簡單項目,您可能只測試頂級模塊。

請注意,Guice 不會注入空值,除非使用@Nullable注釋該字段,因此您很少需要在測試中驗證注入的對象是否為空。 事實上,當我用@Inject注釋構造函數時,我不打算檢查參數是否為null (實際上,我的測試經常在構造函數中注入null以保持測試簡單)。

另一種測試配置的方法是使用測試套件來端到端測試您的應用程序。 雖然端到端測試名義上測試用例,但它們會間接檢查您的應用程序是否配置正確,(所有依賴項都是有線的等等)。 另一方面,單元測試應該只關注域,而不是關注部署代碼的上下文。

我也同意NamshubWriter的回答。 我不反對檢查配置的測試,只要它們被分組到單元測試的單獨測試套件中。

恕我直言,你不應該測試。 谷歌Guice家伙有單元測試斷言注射按預期工作 - 畢竟,這就是Guice的目的。 您應該只為自己的代碼(A和B)編寫測試。

我認為你不應該測試私人成員的設置。 最好測試你班級的公共界面。 如果不注入成員“b”,你可能會得到一個執行測試的NullPointerException,這應該是很多警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM