所以这是场景
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;
}
}
在我的测试中,我有这个,因为我想将布尔值设置为true。
@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
答案 0 :(得分:0)
如果你想学习编写单元测试,你可以做的最好的事情之一是停止使用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
}
坚持使用简单的Mockito是一门很好的学科,可以教你良好的OOP练习。 Mocktio文档非常适合解释这一点,你可以通过阅读它获益良多。