所以这是场景
public class Report {
public void Generate {
if (!isValidDate) {
return;
}
//calling other method
}
protected boolean isValidDate() {
boolean isValid = true;
//some logic here to change to false
return isValid;
}
}
在我的测试中,我想将布尔值设置为真。
@InjectMocks
Report report;
@Before
public void setUp() throws Exception {
Whitebox.setInternalState(report, "isValidParameters", true);
}
@Test
public void testReport() throws Exception {
//test logic to be added here
}
然后我得到了RuntimeException:无法在私有字段上设置内部状态。有人可以帮助我如何在这里设置该受保护方法的布尔值吗?tia
如果要学习编写单元测试,您可以做的最好的事情之一就是停止使用PowerMockito 。
您想自我测试的一种受保护的方法表明您的班级可能承担太多的责任,需要重构。
而不是方法,为什么不使用提取物体模式?
public class DateValidator {
public boolean isValid(Date date) {
//previous logic from protected method goes here
}
}
然后,您可以将其传递到班级的构造函数中:
public class Report {
private final DateValidator dateValidator;
public Report(DateValidator dateValidator) {
this.dateValidator = dateValidator;
}
}
现在您的测试看起来像这样:
@Mock DateValidator mockDateValidator;
//system under test
Report report;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
report = new Report(mockDateValidator);
}
@Test
public void test() throws Exception {
when(mockDateValidator.isValid()).thenReturn(true);
//your test here
}
坚持普通的莫科托(Plain Mockito)是一门很好的学科,可以教您良好的OOP实践。模型文档非常适合解释这一点,并且您可以通过阅读很多。