我需要有关处理JUnit测试和CDI事件的帮助

问题描述 投票:0回答:2

我需要帮助为我的课程建立测试。这个课程做了很多事情,由于我没有时间,所以我不允许重构它(至少我的公司没有分配时间)。

我必须使用伪造的类,但它看起来像这样:

@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列出它们要花我永远。有没有更好的方法?

java cdi junit4
2个回答
0
投票

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

就开销代码而言,此解决方案是一种简单,小型的解决方案。就开销类加载而言,这是一个巨大的解决方案。


0
投票

我不确定我理解你要做什么,但是如果它是在启用CDI的情况下进行的JUnit测试,请查看weld-junit。它可与JUnit 4或5一起使用,并在运行测试之前启动Weld,从而允许您指定应在Bean归档中包含的内容(或留待发现)。最新版本适用于CDI 2.0,旧版本适用于CDI 2.0。不知道您要运行哪一个。

这使您可以在成熟的CDI环境中进行测试,而无需对其进行模拟。它可能不是您追求的。您仍然必须将这些类加载到CL中,但可以将发现限制为测试所需的最小集合。

© www.soinside.com 2019 - 2024. All rights reserved.