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

时间:2014-06-19 00:12:24

标签: java android unit-testing dependency-injection

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

执行此操作

然而,我似乎无法将其用于原始boolean。我该怎么做呢?或者什么框架允许这个? (我实际上在Android项目上)

例如:

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来访问此布尔值;因为这会将状态可变性暴露给外界?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:1)

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

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

java-set-field-value-with-reflection