2017-10-11 8 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(); 
} 

다음 : 나는 HikariModule 내 응용 프로그램에 지속성을 추가 시작할 때까지

@Inject 
private UserService userService; 

이것은 잘 작동했다. 내가 HikariModule guice 주입 시험에서 실패에서 DataSource 클래스는 오는에 따라 서비스가있는 경우 내 레지스트리 지금 여러 모듈로 구성되어 있기 때문에

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

: 지금 Guice 레지스트리 생성은 조금 더 복잡하다.

내 목표는 다음과 같은 방식으로 테스트를 작성을 허용하는 것입니다 :

@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()); 
} 

테스트에서 서비스 종속성을 주입의 올바른 접근 방식은 무엇입니까? 나는 내 자신을 만들고 오버 라이딩하는 것보다는 guys 모듈을 MainClassApplicationUnderTest에서 재사용하는 것을 매우 좋아한다.

답변

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이 null이 아니며 클래스를 삽입 할 수 있다는 것을 알게 될 것입니다.

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