Angenommen, eine IReader-Schnittstelle, eine Implementierung der IReader-Schnittstelle ReaderImplementation und eine Klasse ReaderConsumer, die Daten vom Reader verwendet und verarbeitet.
public interface IReader
{
object Read()
}
Implementierung
public class ReaderImplementation
{
...
public object Read()
{
...
}
}
Verbraucher:
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
}
}
Zum Testen von ReaderConsumer und der Verarbeitung verwende ich einen IReader-Mock. So wird ReaderConsumer:
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 dieser Lösung führt Mocking einen if-Satz für den Produktionscode ein, da nur der Mocking-Konstruktor Instanzen der Schnittstelle bereitstellt.
Während des Schreibens wird mir klar, dass der try-finally-Block in keiner Beziehung steht, da er dazu dient, den Benutzer beim Ändern des Speicherorts während der Laufzeit der Anwendung zu unterstützen.
Insgesamt riecht es, wie könnte es besser gehandhabt werden?
ReaderConsumer
unabhängig zu machenReaderImplementation
?