2017-09-29 64 views
-1

因此,这里的情景单元测试 - 我如何从受保护的方法存根布尔值?

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

回答

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坚持是一个很好的学科,将教你良好的面向对象操作。 Mocktio文档对于解释这一点非常有用,您可以通过阅读它获益良多。