If there are objects being instantiated on the action due to lack of contructor injection how can you mock them to test?
Puoi refactoring il tuo codice per incapsulare tutto il codice che dovrebbe essere deriso in a
separare i metodi protetti e quindi utilizzare partial-mocks per sostituire quella logica.
Esempio (in java)
Original
protected void moveFiles(File[] destFiles, File[] sourceFiles) {
int pos = 0;
while (pos < fileCount) {
File sourceFile = sourceFiles[pos];
File destFile = destFiles[pos];
// do some processing. i.e. rename destFile if it already exists.
// do the copy. the test should not execute this
sourceFile.renameTo(destFile)
pos++;
}
}
refactoring:
protected void moveFiles(File[] destFiles, File[] sourceFiles) {
int pos = 0;
while (pos < fileCount) {
File sourceFile = sourceFiles[pos];
File destFile = destFiles[pos];
// do some processing. i.e. rename destFile if it already exists.
osFileMove(destFile, sourceFile);
pos++;
}
}
/** can be replaced by mock/stub in unittests */
protected boolean osFileMove(File destFile, File sourceFile) {
return sourceFile.renameTo(destFile);
}
nel test puoi sostituire osFileMove
con un falso (esempio usa java org.mockito.Mockito)
import static org.mockito.Mockito.*;
FileCommands sut;
@Before
public void setup() {
sut = spy(new FileCommands());
doReturn(true).when(sut).osCreateDirIfNeccessary(any(File.class));
doReturn(true).when(sut).osFileCopy(any(File.class), any(File.class));
doReturn(true).when(sut).osFileMove(any(File.class), any(File.class));
doReturn(true).when(sut).osDeleteFile(any(File.class));
}
Se in seguito decidi di usare ioc puoi spostare le operazioni del file os-spcific osxXXXX
in una classe separata più un'interfaccia