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



我现在已经编写了下面的类和测试代码,并且运行良好。

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的测试课吗。提前感谢!

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

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

最新更新