2017-10-11 68 views
0

我想寫一個JUnit測試,注入服務依賴關係。Guice注入Ratpack服務器的JUnit測試

protected MainClassApplicationUnderTest aut = new MainClassApplicationUnderTest(App.class) { 
    @Override 
    protected void addImpositions(final ImpositionsSpec impositions) { 
     impositions.add(UserRegistryImposition.of(appRegistry -> { 
      // Allow modifying Injector in tests 
      return appRegistry.join(Guice.registry(injector)); 
     })); 
    } 
}; 

private Injector injector = com.google.inject.Guice.createInjector(new Module()); 

@Before 
public void setup() { 
    injector.injectMembers(this); 
} 

@After 
public void tearDown() { 
    aut.close(); 
} 

,然後用注射服務在我的測試類:

@Inject 
private UserService userService; 

這是工作的罰款,直到我開始添加持久化到我的應用程序HikariModule。現在吉斯註冊表創作是一個比較複雜的:

.join(Guice.registry(b -> b 
     .module(HikariModule.class, hikariConfig -> { 
      final String dbUrl = System.getenv("JDBC_DATABASE_URL"); 
      hikariConfig.setJdbcUrl(dbUrl); 
     }) 
     .module(Module.class) 
     .bind(DbMigrator.class) 
    ).apply(r)) 

因爲我的註冊表現在由多個模塊組成,如果我有這取決於DataSource類來從HikariModule吉斯注射試驗失敗的服務。

我的目標是讓編寫測試以下列方式:

@Inject // <- not required can be done in @Before method 
private UserService userService; // <- Inject it somehow from Application under test 

@Test 
public void testUser() { 
    final Result<User, String> userResult = userService.create(new User.Registration()); 
    final ReceivedResponse res = aut.getHttpClient().get("https://stackoverflow.com/users/" + user.userId); 
    assertEquals(200, res.getStatusCode()); 
} 

什麼是測試注射服務的依存關係的正確方法?我非常喜歡重複使用來自MainClassApplicationUnderTest的guice模塊,而不是創建我自己的並覆蓋它們。

回答

0

經過相當一段時間的處理與這個問題和Ratpack鬆懈的幫助後,我設法把這個關閉。

首先,我們需要在本地變量中捕獲我們的應用程序註冊表。

private Registry appRegistry; 

protected MainClassApplicationUnderTest aut = new MainClassApplicationUnderTest(App.class) { 
    @Override 
    protected void addImpositions(final ImpositionsSpec impositions) { 
     impositions.add(UserRegistryImposition.of(r -> { 
      appRegistry = r; 
      return Registry.empty(); 
     })); 
    } 
}; 

事實證明,有一個漂亮的方法來啓動應用程序。所以當注入類時,我們會知道Registry不會爲空,我們可以注入類。

protected <T> T inject(final Class<T> classOf) { 
    aut.getAddress(); 
    return appRegistry.get(classOf); 
} 

然後在測試類中,我們可以簡單地注入註冊表中存在的任何類。

final UserService userService = inject(UserService.class); 
// OR 
final DataSource dataSource = inject(DataSource.class);