我正在使用WELD-SE实现Java SE环境下的依赖注入编程。因此,类的依赖关系看起来像这样:
public class ProductionCodeClass {
@Inject
private DependencyClass dependency;
}
在为这个类编写单元测试时,我正在为DependencyClass
创建mock,并且因为我不想为每次运行测试都启动完整的CDI环境,所以我手动“注入”了mock:
当为该类编写单元测试时,我创建一个 DependencyClass
的mock对象,并且由于我不想为每一次运行测试都启动一个完整的CDI环境,因此我手动进行“注入”操作。
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 项目,可以将其作为测试依赖项添加到我的项目中。
但是,在其他常用库中是否有现成的东西我错过了吗?对我通常的做法有什么评论吗?