如何在生产中使用 CDI 测试类时注入模拟
2022-09-03 01:11:52
我正在Java SE环境中使用WELD-SE进行依赖注入。因此,类的依赖项如下所示:
public class ProductionCodeClass {
@Inject
private DependencyClass dependency;
}
在为这个类编写单元测试时,我正在创建一个模拟,由于我不想为我运行的每个测试启动一个完整的CDI环境,所以我手动“注入”模拟:DependencyClass
import static TestSupport.setField;
import static org.mockito.Mockito.*;
public class ProductionCodeClassTest {
@Before
public void setUp() {
mockedDependency = mock(DependencyClass.class);
testedInstance = new ProductionCodeClass();
setField(testedInstance, "dependency", mockedDependency);
}
}
静态导入的方法,我用我在测试中使用的工具在一个类中编写了自己:setField()
public class TestSupport {
public static void setField(
final Object instance,
final String field,
final Object value) {
try {
for (Class classIterator = instance.getClass();
classIterator != null;
classIterator = classIterator.getSuperclass()) {
try {
final Field declaredField =
classIterator.getDeclaredField(field);
declaredField.setAccessible(true);
declaredField.set(instance, value);
return;
} catch (final NoSuchFieldException nsfe) {
// ignored, we'll try the parent
}
}
throw new NoSuchFieldException(
String.format(
"Field '%s' not found in %s",
field,
instance));
} catch (final RuntimeException re) {
throw re;
} catch (final Exception ex) {
throw new RuntimeException(ex);
}
}
}
我不喜欢这个解决方案的原因是,在任何新项目中,我都需要这个帮手一遍又一遍。我已经将其打包为Maven项目,我可以将其作为测试依赖项添加到我的项目中。
但是,在我错过的其他一些公共库中,难道没有现成的东西吗?对我这样做的方式有什么评论吗?