我需要帮助为我的课程建立测试。这个课程做了很多事情,由于我没有时间,所以我不允许重构它(至少我的公司没有分配时间)。
我必须使用伪造的类,但它看起来像这样:
@Inject
protected ClassZ(ClassA classA, ClassB classB, ClassC classC,
ClassD classD, ClassE classE, ClassF classF,
ClassG classG, ClassH classH, ClassI classI, etc..)
public void complexMethod()
{
// reads from files using classA, does stuff with classB, etc.
}
Mockito对我不起作用,因为注入的那些类需要大量工作:从文件读取,写入文件,存储内存数据库等。我知道,这是不好的代码,但我坚持使用需要类的真实实例。 @Spy批注仍仅执行默认方法。因此,boolean readFile
每次都会返回False
。
如何摆脱依赖地狱? @Inject所有依赖项或使用@AdditionalClasses
列出它们要花我永远。有没有更好的方法?
U。我有办法不建议这样做,但昨天我需要启动集成测试并运行它。我将发布此答案,以防其他人遭受与我相同的痛苦。
由于同事的讨论,我为JUnit测试找到了可行的解决方案。事实证明,在@Before
方法中使用Weld是100%有效的。我正在用Weld加载所有内容,并使用CDI.current().select().get()
调用实例化它们,如下所示:
@Before
public void setup()
{
RuntimeSupport.initializeDefaults();
Weld weld = new Weld();
weld.initialize();
classZ = CDI.current().select(ClassZ.class).get();
}
这有时需要手动实例化其他依赖项:
例如
ClassY classY = CDI.current().select(ClassY.class).get();
classY.toString(); // ugly forced construction
就开销代码而言,此解决方案是一种简单,小型的解决方案。就开销类加载而言,这是一个巨大的解决方案。
我不确定我理解你要做什么,但是如果它是在启用CDI的情况下进行的JUnit测试,请查看weld-junit。它可与JUnit 4或5一起使用,并在运行测试之前启动Weld,从而允许您指定应在Bean归档中包含的内容(或留待发现)。最新版本适用于CDI 2.0,旧版本适用于CDI 2.0。不知道您要运行哪一个。
这使您可以在成熟的CDI环境中进行测试,而无需对其进行模拟。它可能不是您追求的。您仍然必须将这些类加载到CL中,但可以将发现限制为测试所需的最小集合。