how to elegantly dependency inject a primitive boolean for testing?
我正在使用Mockito进行单元测试,因此看起来我能够使用
但是,我似乎无法让它适用于原始
例如:
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之上使用
如果存在控制反转(@ 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。)