关于java:如何优雅地依赖注入一个原始布尔值进行测试?

how to elegantly dependency inject a primitive boolean for testing?

我正在使用Mockito进行单元测试,因此看起来我能够使用@InjectMocks@Mock注释注入某些对象。 我假设我可以为对象类型Boolean执行此操作

但是,我似乎无法让它适用于原始Boolean。 我该怎么做呢? 或者什么框架允许这个? (我实际上是在一个Android项目上)

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MethCook {
    private Laboratory mLab; // i can inject this
    private Assistant mJessePinkman; // this is injectable too
    private boolean mCanCookPureCrystal; // how do i access/inject this?

    private void cookBlueMeth() { ... }

    private void onTraumatized() {
        mCanCookPureCrystal = false;
        startMoppingAround();
        beDepressed();
        neverWantToCookAgain();
    }
}

注意:优雅意味着简洁和简洁,如...我宁愿不在getter / setter之上使用@VisibleForTesting来访问此布尔值; 因为这会暴露国家对外界的可变性?


如果存在控制反转(@ Autowired / @ Value / @ Resource),则反射很容易。

1
2
3
4
5
6
    @Before
    public void init() {
        Field f = myMethCooking.getClass().getDeclaredField("mCanCookPureCrystal");
        f.setAccessible(true);
        f.set(myMethCooking, false);
    }

Java的设置域值,与反射!


Mockito是一个模拟框架,而不是注入框架。 @Mock注释不支持开发人员不拥有的模拟事物,如boolean.class。

尝试在JUnit的@Before注释中设置布尔值,例如:

1
2
3
@Before public void inject_mCanCookPureCrystal() {
    myMethCooking.setMCanCookPureCrystal(false);
}

这是Mockito增强请求数据库中的一个问题,该数据库讨论了扩展注释,可能采用可与原语一起使用的方式:Mockito Issue 290。

如果该值没有setter,那么您将需要预先执行一个根据需要设置它的方法。 许多测试人员会争辩说,如果某些事情不能直接在外部设置,那么它就不是课堂公共合同的一部分,也不应该通过注入,反思,注释或任何其他方式设置。 (参见https://stackoverflow.com/a/2811171/325452。)