单元测试 - 如何从受保护的方法中取消布尔值?

时间:2017-09-29 23:36:58

标签: unit-testing junit mockito powermockito

所以这是场景

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

1 个答案:

答案 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文档非常适合解释这一点,你可以通过阅读它获益良多。