Ho un'applicazione molla e voglio creare un test unitario su un controller come questo. Il problema è che la classe Wrapper è una classe interna privata, quindi Wrapper non è compreso nel test. È possibile deriderlo con Mockito senza cambiare la classe del controller. Posso usare prepareData() per ottenere un'istanza dell'oggetto, ma non so se questo potrebbe essere usato per deridere quell'oggetto.Come prendere in giro una classe interna privata
Grazie
@Controller
public class Controller {
private class Wrapper {
private Object1 field1;
private Object2 field2;
private Object1 method1(){
...
}
private Object2 method1(){
...
}
}
@ModelAttribute("data")
public Wrapper prepareData() {
return new Wrapper();
}
public String save(@ModelAttribute("data") Wrapper wrapper, BindingResult result, Model model){
...
}
}
Quindi, nel mio test vorrei avere qualcosa di simile
@Test
public void usernameEmpty(){
BindingResult result = Mockito.mock(BindingResult.class);
Model model = Mockito.mock(Model.class);
Wrapper data = //how to mock it
when(data.method1()).then(new Foo1());
when(data.method2()).then(new Foo2());
String returned = controller.save(data, result, model);
....
}
Chiedo perché vuoi farlo? Probabilmente finirai per testare il codice sbagliato. Se la classe interiore ha delle dipendenze (probabilmente ottenute attraverso il controllore?) Deride quelle. Aspettare? Il tuo codice viene compilato? Se Wrapper è una classe privata, puoi usarlo come argomento per un metodo pubblico? –
@ Martininho Fernandes Sono nuovo nei test. Volevo solo fare un test sul metodo di salvataggio, quindi ho dovuto prendere in giro l'oggetto Wrapper in modo da poter definire gli oggetti di ritorno quando alcuni metodi sono stati invocati su di esso. Sì, il controller compila (il test non fa ma questo è il problema - che non posso usare la classe Wrapper nel test). Forse c'è un modo migliore per farlo. – Javi
Java mi ha appena sorpreso di nuovo (sul negativo). Questo mi rende impotente ad aiutare senza un compilatore Java a portata di mano :(Comunque, anche se permesso, non penso che sia un buon progetto avere un metodo pubblico che richiede la conoscenza dei privati, rompendo l'incapsulamento. usare questo metodo nel vero codice reale? È possibile? –