由于公私字段矛盾,使用Junit @Rule进行CdiUnit测试是不可能的



下面的代码片段足以重现我的问题:

  • 我设置thrown属性public并得到错误org.jboss.weld.exceptions.DefinitionException: WELD-000075: Normal scoped managed bean implementation class has a public field
  • 或者我删除public修饰符并得到错误org.junit.internal.runners.rules.ValidationError: The @Rule 'thrown' must be public.
  • 我还试图让public修饰符到位,并在类上添加@Dependent注释范围,但得到错误org.jboss.weld.exceptions.DefinitionException: WELD-000046: At most one scope may be specified on [EnhancedAnnotatedTypeImpl] public @Dependent @ApplicationScoped @RunWith

我去掉了所有不必要的代码,但这是一个相当复杂的单元测试,包含mock、通过CDI注入服务和一些预计会抛出异常的测试方法。

import org.jglue.cdiunit.CdiRunner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
@RunWith(CdiRunner.class)
public class FooBarTest {
    @Rule
    public ExpectedException thrown = ExpectedException.none();
    @Test
    public void test() {
    }
}

所以我的问题是,一方面Weld希望所有字段都不是公共的,因为它将无法代理类,另一方面,JUnit希望规则字段是公共的,因为它正在使用反射来访问它们,并且不想使用setAccessible(true)方法,因为安全管理器是活动的。如何处理这种矛盾呢?

注:我还发现了一个提示注释,说明

你也可以用@Rule注释一个方法,这样可以避免

这个问题

但是我找不到任何在方法上使用@Rule注释的junit测试示例,我打算就此提出一个单独的问题

我找到了解决这个问题的方法。为了将来参考,这里是一个工作的片段,希望这将帮助其他人。

import org.jglue.cdiunit.CdiRunner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;

@RunWith(CdiRunner.class)
public class FooBarTest {
    private ExpectedException thrown = ExpectedException.none();
    @Rule
    public ExpectedException getThrown() {
        return thrown;
    }
    @Test
    public void test() {
        thrown.expect(ArithmeticException.class);
        int i = 1 / 0;
    }
}

相关内容

  • 没有找到相关文章

最新更新