【问题标题】:Unit Testing - how do I stub boolean value from protected method?单元测试 - 如何从受保护的方法中存根布尔值?
【发布时间】:2017-09-29 23:36:57
【问题描述】:

所以这里是场景

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: Unable to set internal state on a private field。有人可以帮助我如何在这里为我的测试设置该受保护方法的布尔值吗? TIA

【问题讨论】:

    标签: unit-testing junit mockito powermockito


    【解决方案1】:

    如果您想学习编写单元测试,您可以做的最好的事情之一就是停止使用 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 文档很好地解释了这一点,阅读它可以让您受益匪浅。

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 1970-01-01
      • 2012-05-22
      • 2010-11-10
      • 2013-10-10
      • 1970-01-01
      • 2011-08-21
      • 2012-11-05
      • 1970-01-01
      相关资源
      最近更新 更多