Я хотел бы создать junit набор тестов с помощью JUnit 4, где названия тестовых классов, которые будут включены, не известны, пока набор тестов не выполняется.
В JUnit 3 я мог сделать это:
public final class MasterTester extends TestCase
{
/**
* Used by junit to specify what TestCases to run.
*
* @return a suite containing what TestCases to run
*/
public static TestSuite suite() {
TestSuite suite = new TestSuite();
for(Class> klass : gatherTestClasses()) {
suite.addTestSuite(klass);
}
return suite;
}
}
и позвольте gatherTestClasses()
соглашение о методе с выяснением, что тестовые классы работать.
В JUnit 4 в документации говорится для использования аннотации: @SuiteClasses({TestClass1.class, TestClass2.class...})
создавать мой набор тестов. Там являются многочисленными ТАК ответы, показывающие, как сделать это. К сожалению, примеры, которые я вижу, кажется, не допускают передачу динамично сгенерированного списка TestClasses.
Это ТАК отвечает, предложил, чтобы я должен был разделить на подклассы BlockJUnit4ClassRunner
который я не хочу делать.
Динамично указанные наборы тестов походят на что-то, что должно быть в JUnit 4 где-нибудь. Кто-либо знает где?
Я нашел набор Classpath весьма полезным при использовании с соглашением об именах в моих тестовых классах.
https://github.com/takari/takari-cpsuite
Вот пример:
import org.junit.extensions.cpsuite.ClasspathSuite;
import org.junit.runner.RunWith;
@RunWith(ClasspathSuite.class)
@ClassnameFilters({".*UnitTest"})
public class MySuite {
}
Я не уверен, что делает gatherTestClasses (), но допустим, что он возвращает некоторые тесты, когда ОС Linux и разные тесты, когда ОС Windows. Вы можете воспроизвести это в JUnit 4.4 с предположениями :
@Test
public void onlyOnLinux() {
assumeThat(getOS(), is(OperatingSystem.LINUX));
// rest of test
}
@Test
public void onlyOnWindows() {
assumeThat(getOS(), is(OperatingSystem.WINDOWS));
// rest of test
}
@Test
public void anyOperatingSystem() {
// just don't call assumeThat(..)
}
Реализация getOS ()
и OperatingSystem
является вашим пользовательским кодом.