简体   繁体   中英

How to get Guice injector for a class with parameterised constructor

I have following class and test code write now and it is working fine.

public class AppleRegistry {
  private final ImmutableMap<String, Apple> appRegistry;
  
  AppleRegistry(Apple... apple) {
    this.appRegistry = createRegistry(apple);
  }

  @Inject
  AppleRegistry(
    Provider<GoodApple> goodAppleProvider,
    Provider<BadApple> badAppleProvider,
    Provider<BrandedApple> brandedAppleProvider) {
      this(goodAppleProvider.get(), badAppleProvider.get(), brandedAppleProvider.get());
    }
  
  private static ImmutableMap<String, Apple> createRegistry(Apple... apple){......}
  
  public Apple findApple(String key) {....}
}

public interface Apple{
...
}

public class GoodApple implements Apple {
  private final Producer producer;
  private final Suuplier supplier;

  @Inject
  GoodApple(Producer producer, Supplier supplier) {....}
....
}

public class BadApple implements Apple {.....}
public class BrandedApple implements Apple {....}

Test class
@RunWith(JUnit4.class)
@SmallTest
public class AppleRegistryTest {

  @Before
  public void setUp() throws Exception {
    Guice.createInjector().injectMemeber(this);
  }

  @Test
  public void testFindApple_emptyRegistry() {
    Optional<Apple> apple = new AppleRegistry().findApple("First");
    assertFalse(apple.isPresent());
  }
}

Till here everything is working fine and the test is passing. Now I want to introduce new dependency in AppleRegistryClass Here are the changes

public class AppleRegistry {
 private final ImmutableMap<String, Apple> appRegistry;
 private final SystemHelper systemHelper;
      
 AppleRegistry(SystemHelper systemHelper, Apple... apple) {
    this.systemHelper = systemHelper;
    this.appRegistry = createRegistry(apple);
  }

  @Inject
  AppleRegistry(
    Provider<GoodApple> goodAppleProvider,
    Provider<BadApple> badAppleProvider,
    Provider<BrandedApple> brandedAppleProvider
    SystemHelper systemHelper) {
      this(systemHelper, goodAppleProvider.get(), badAppleProvider.get(), brandedAppleProvider.get());
    }
  
  private static ImmutableMap<String, Apple> createRegistry(Apple... apple){......}
  
  public Apple findApple(String key) {....}
}

// This is an existing class
@Singleton
public class SystemHelper {
  private final SystemDao systemDao;

  @inject
  public SystemHelper(SystemDao systemDao) {
    this.systemDao = systemDao;
  }
....
}

public class SystemDao {
  private final SpannerProtoDao<SystemConfig> spannerProtoDao;

  @Inject
  public SystemDao(@AbcDatabase Database abcDatabase) {
    spannerProtoDao = SpannerProtoDao.newBuilder(SystemConfig.class)
                         .setDatabase(abcDatabase)
                         .setTable("Table").setMessageColumn("column")
                         .build();
  }
}

Now when I write the test for new changes it is getting timed out Test code:

@RunWith(JUnit4.class)
@SmallTest
public class AppleRegistryTest {

  private final SystemHelper systemHelper;

  @Before
  public void setUp() throws Exception {
    Guice.createInjector((Module) new SystemHelper(new SystemDao(TestUtil.createDatabase()))).injectMemeber(this);
  }

  @Test
  public void testFindApple_emptyRegistry() {
    Optional<Apple> apple = new AppleRegistry(systemHelper).findApple("First");
    assertFalse(apple.isPresent());
  }
}

Can someone please help me in writing the test class for AppleRegistry. Thanks in advance!

I did something like this. Is this a bad coding practice?

public class AppleRegistryTest {
  @Rule public final Mocks mocks = new Mocks(this);
  @Mock private SystemHelper systemHelper;

  @Test
  public void testFindApple_emptyRegistry() {
    Mockito.when(systemHelper.isXyzEnabled()).thenReturn(False);
    Apple apple = new AppleRegistry(systemHelper).findApple("First");
    assertFalse(apple.isPresent()); 
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM