Supponendo un'interfaccia IReader, un'implementazione dell'interfaccia IReader ReaderImplementation e una classe ReaderConsumer che consuma ed elabora i dati dal lettore.
public interface IReader
{
object Read()
}
Attuazione
public class ReaderImplementation
{
...
public object Read()
{
...
}
}
Consumer:
public class ReaderConsumer()
{
public string location
// constructor
public ReaderConsumer()
{
...
}
// read some data
public object ReadData()
{
IReader reader = new ReaderImplementation(this.location)
data = reader.Read()
...
return processedData
}
}
Per testare ReaderConsumer e l'elaborazione, utilizzo una simulazione di IReader. Quindi ReaderConsumer diventa:
public class ReaderConsumer()
{
private IReader reader = null
public string location
// constructor
public ReaderConsumer()
{
...
}
// mock constructor
public ReaderConsumer(IReader reader)
{
this.reader = reader
}
// read some data
public object ReadData()
{
try
{
if(this.reader == null)
{
this.reader = new ReaderImplementation(this.location)
}
data = reader.Read()
...
return processedData
}
finally
{
this.reader = null
}
}
}
In questa soluzione, il mocking introduce una frase if per il codice di produzione, poiché solo il costruttore mocking fornisce un'istanza dell'interfaccia.
Durante la scrittura, mi rendo conto che il blocco try-finally è in qualche modo non correlato poiché è lì per gestire l'utente che cambia la posizione durante l'esecuzione dell'applicazione.
Nel complesso sembra maleodorante, come potrebbe essere gestito meglio?