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