2017-09-29 7 views
-1

Voici donc le scénarioTests unitaires - comment puis-je remplacer une valeur booléenne par une méthode protégée?

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; 
    } 
} 

Et dans mon test, je ce que je veux définir la valeur booléenne pour être vrai.

@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 
} 

Puis je me suis le RuntimeException: Impossible de définir l'état interne sur un terrain privé. Quelqu'un peut-il m'aider s'il vous plaît sur la façon dont je peux définir la valeur booléenne de cette méthode protégée pour mon test ici? TIA

Répondre

0

Si vous voulez apprendre à écrire des tests unitaires, l'une des meilleures choses que vous pouvez faire est arrêtez d'utiliser Powermockito.

Une méthode protégée que vous voulez tester par elle-même est un signe que votre classe peut avoir trop de responsabilités et doit être refactorisée.

Au lieu de la méthode, pourquoi ne pas utiliser le modèle d'objet d'extraction?

public class DateValidator { 
    public boolean isValid(Date date) { 
     //previous logic from protected method goes here 
    } 
} 

Ensuite, vous pouvez passer ce dans le constructeur de votre classe:

public class Report { 

    private final DateValidator dateValidator; 

    public Report(DateValidator dateValidator) { 
     this.dateValidator = dateValidator; 
    } 
} 

Maintenant votre test peut ressembler à ceci:

@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 
} 

Sticking avec Mockito plaine est une bonne discipline vous apprendra de bonnes pratiques de POO. La documentation de Mocktio est très bonne pour expliquer cela et vous pourriez en profiter beaucoup en la lisant.