Guava hat eine umfangreiche Reihe von Tests für die Sammlung Implementierungen in JUnit3 geschrieben, die wie folgt aussehen:Wie kann ich eine konfigurierbare JUnit4-Testsuite erstellen?
/*
* Copyright (C) 2008 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class CollectionRemoveTester<E> extends AbstractTester<E> {
@CollectionFeature.Require(SUPPORTS_REMOVE)
@CollectionSize.Require(absent = ZERO)
public void testRemove_present() {
...
}
}
und dann unter Verwendung TestSuiteBuilder
s verschiedenen Sammlungen getestet, die in einer Reihe von Merkmalen und Generatoren für die Sammlung Art passieren, und ein stark reflektierendes Framework identifiziert die Testmethoden, die ausgeführt werden sollen.
Ich möchte etwas ähnliches in JUnit4 bauen, aber es ist mir nicht klar, wie ich vorgehen soll: meine eigene Runner
zu bauen? Theorien? Meine beste Vermutung ist, so weit, etwas zu schreiben, wie
abstract class AbstractCollectionTest<E> {
abstract Collection<E> create(E... elements);
abstract Set<Feature> features();
@Test
public void removePresentValue() {
Assume.assumeTrue(features().contains(SUPPORTS_REMOVE));
...
}
}
@RunWith(JUnit4.class)
class MyListImplTest<E> extends AbstractCollectionTest<E> {
// fill in abstract methods
}
Die allgemeine Frage ist so etwas wie: wie, in JUnit4, könnte ich eine Reihe von Tests für einen Schnittstelle Typen bauen, und dann diese Tests auf einzelne Implementierungen anwenden?
Ich mag Ihren Ansatz, es hält die Testklasse einfach. @ Kategorie oder parametrisierte Klasse passt auch nicht hier. Da das Problem darin liegt, herauszufinden, ob eine Methode durch ihre Implementierung implementiert wird, was nur durch Reflektion geschehen kann, wenn der implementierende Code eine Abgrenzung hat, ist der andere einfache Ansatz einer, den Sie getan haben. Die Testklasse definiert (über Features) welche Methoden getestet werden sollen. Um es weiter zu vereinfachen, können Sie Dataprovider erkunden und benötigen möglicherweise nicht die mehreren konkreten Testklassen, wie MyListImplTest und ein Datenprovider. HTH –