|
|
| 2 |
Gibt es bei C# nicht noch ein Attribut womit man private Methoden zugänglich machen kann?
– GENiALi 14.10.2009
|
|
| 2 |
Für C# weiss ich es nicht, aber mit Java geht das. Würde ich aber keinem empfehlen, da die meisten das nur missbrauchen.
– keinhaar 14.10.2009
|
|
| 1 |
In C# würde es per Reflektion gehen. Aber siehe keinhaar's Anmerkung -> Missbrauchgefahr
– gfoidl 14.10.2009
|
|
|
Wie sieht es mit Gettern und Settern aus? Ist es nötig solche trivialitäten wirklich testen?
– ermin 14.10.2009
|
||
| 1 |
Wenn über eine Eigenschaft (Getter, Setter) nur ein Feld gelesen/geschrieben wird erspare ich mir das ;)
Wird in der Eigenschaft lazy loading/evaluation umgesetzt dann wirds getestet. – gfoidl 14.10.2009
|
|
|
|
|
Dass static gutes Design würde ich nicht pauschal stehen lassen - kann sein muss aber nicht ;)
– gfoidl 14.10.2009
|
||
|
Absolut richtig! :-)
Meinte damit, dass es dort, wo es gemacht werden kann, auch überlegt werden sollte. Wenn es dann Sinn macht, spricht das für gutes Design. – LastFreeNickname 14.10.2009
|
|
|
|
Etwas zu hart formuliert, aber der Kern stimmt. Wobei ich hinzufügen muss, dass die kombinatorische Explosion natürlich auf einem "naiven" Ansatz basiert. Man verwendet ja spezifisches Wissen, um Tests effizient aufzubauen und sich auf die Parameter-Werte zu konzentrieren, bei denen man eine Verhaltensänderung erwarten würde. Dann kommt man auch mit weniger auf 100% C0-Abdeckung.
– LastFreeNickname 05.11.2009
|
||
|
Wenn man internes Wissen verwendet, dann ist das möglicherweise bei nächsten Release wieder hinfällig und damit falsch.
100% Testabdeckung sind einfach nicht drin. Damit muss man sich abfinden. Man kann einige Fälle durchlaufen lassen und das war es. Man kann dafür sorgen dass wenigstens jede Codezeile einmal aufgerufen wurde, aber besonders aussagefähig ist das nicht. Es weckt nur die trügerische Illusion wie in "ich bin hier schon mal unfallfrei vorbei gefahren also fahre ich hier immer unfallfrei" – stefan.bachert 09.05.2010
|
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
try {
final Document doc = DocumentBuilderFactory.newInstance().
newDocumentBuilder().newDocument();
} catch (ParserConfigurationException e) {
// egal, was auch immer ...
e.printStackTrace();
}
InputStream stream = new ByteArrayInputStream("foo".getBytes());
try {
stream.read();
} catch (IOException e){
; // hier komme ich nie hin
}|
|
|
Das Beispiel stellt wohl nicht den gesamten Kontext dar, weshalb ich es schwierig finde zu beantworten. So wie ich den Auszug verstehe, testet er nur die Funktion einer Fremdklasse, da die Variable doc lokal ist.
Auszug aus der API: @throws ParserConfigurationException if a DocumentBuilder cannot be created which satisfies the configuration requested. Wie gesagt, was ist der Sinn hinter dem Test? Bei offiziellen APIs kann man davon ausgehen, dass sie funktionieren. – LastFreeNickname 20.10.2009
|
||
|
Ok, ich habe mich vielleicht etwas zu kurz gefasst :-).
Nehmen wir mal an, ich täte etwas sinnvolles mit dem erzeugten Dokument (indem ich es z.B. aus einer Methode zurückliefere) und würde für den Code einen Unittest schreiben. newDocumentBuilder() wirft die Exception, ich kann aber nicht 100% Testabdeckung erreichen, weil es mir nicht gelingt, die Exception auszulösen und damit in den catch-Block zu kommen. – fenchurch 20.10.2009
|
||
|
Beim erneuten Lesen deines Kommentars geht fällt mir noch ein Missverständnis auf - mein Beispielcode ist nicht der Test, sonder der zu testende Code.
– fenchurch 20.10.2009
|
||
|
So wie du das Problem schilderst, hätte ich persönlich kein Problem damit, weniger als 100% Abdeckung zu erreichen. Sonst müsstest du jede offizielle API durchtesten...
– LastFreeNickname 20.10.2009
|
||
|
Naja, es ist rein psychologisch betrachtet schon unbefriedigend, wenn im Cobertura-Report so viel rot ist ;-) - aber mal im Ernst, in den anderen Antworten zur Testabdeckungsfrage, auch in deiner, war davon die Rede, dass 100% gut und wünschenswert ist (und da schließe ich mich auch an), aber manchmal weiß ich eben nicht, wie ich das hinbekommen kann. Auf dieses Problem wollte ich hier hinweisen und wenn irgendjemand eine gute Lösung dafür hat, konkret hier vor allem für Exceptions, die in der Praxis nie geworfen werden, wäre das natürlich super.
– fenchurch 20.10.2009
|
public class Controller {
private Date buildStartTime(final int intVal, final long longVal, final int intVal) {
...
}
}Controller instance = new Controller();
Date result = null;
try {
Class clazz = Controller.class;
Method method = clazz.getDeclaredMethod("buildStartTime", new Class[]{Integer.TYPE, Long.TYPE, Integer.TYPE });
method.setAccessible(true);
result = (Date) method.invoke(instance, new Object[]{ 180, 60000L, 40});
} catch (Exception e) {
e.printStackTrace();
fail();
}
|
|
|
|
|
|