java—如何为具有参数化构造函数的类获取guice注入器

ss2ws0br  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(319)

我有下面的类和测试代码编写现在,它是工作良好。

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

直到这里一切正常,考试通过。现在我想在appleregistryclass中引入新的依赖关系这里是更改

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

现在,当我为新更改编写测试时,它将超时测试代码:

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

有人能帮我写appleregistry的测试类吗。提前谢谢!

vzgqcmou

vzgqcmou1#

我做了这样的事。这是一个糟糕的编码实践吗?

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

相关问题