È vero che mockito non è in grado di simulare oggetti che sono già stati migliorati da CGLIB?Mocking Oggetti potenziati CGLIB
public class Article {
@Autowired
private dbRequestHandler
@Autowired
private filesystemRequestHandler
@Transactional
public ArticleDTO getArticleContents() {
//extractText() and then save the data in DTO
//extractImages() and then save the data in DTO
// some other calls to other databases to save data in dto
return articleDTO;
}
public void extractText() {
//call to DB
}
public void extractImages() {
// call to file system
}
}
public class IntegrationTest {
@Autowired
private Article article;
//setup method {
articleMock = Mockito.spy(article);
doNothing().when(articleMock).extractImages();
}
}
Nell'esempio precedente quando si tratta di doNothing().when(articleMock).extractImages();
chiama effettivamente la funzione reale. A ben vedere, l'articoloMock viene migliorato due volte. Una causa di autowiring
e la seconda causa di tempo di spying
.
Se non riesco a spiare oggetti enhaced, come posso testare il metodo getArticle()
nel mio test di integrazione, in modo da poter verificare che venga restituito un DTO corretto.
Nota: in realtà non voglio testare il metodo che chiama il filesystem. solo quelli del DB. ecco perché ho bisogno di testare il metodo getArticle
.
In seguito a ciò che ho trovato di [documentazione] (http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#doNothing()) non vedo immediatamente il problema. L'hai provato creando "l'articolo" da solo, e non farlo autowired (o almeno verificato la correttezza dopo l'autowiring)? – atomman
sì, se creo l'articolo io stesso, sono in grado di spiare. Ma devo autorizzarlo, poiché nella mia applicazione ogni oggetto è creato da autowiring, e se avvio 'Article' da solo allora il campo in Article class è nullo (es. Gli oggetti reqHandler). Se avvii anche quei campi, i campi in quelle classi sono nulli e la catena continua. – samach
Il codice filtrato e le tue domande non si adattano - 'getArticle()' in questione, 'getArticleContents()' nel codice - sta causando una certa confusione. Dovresti considerare di fornire un altro codice 'IntegrationTest'. – Cebence