Весеннее исключение
Это мой тестовый класс. Когда я пытаюсь запустить тестовый метод, получаю следующее исключение.
Я использую parmeterized для тестирования различных входных данных. Я использую maven.не использую ant build.
Exception:
java.lang.Exception: Test class should have exactly one public zero-argument constructor
at org.junit.runners.BlockJUnit4ClassRunner.validateZeroArgConstructor(BlockJUnit4ClassRunner.java:147)
at org.junit.runners.BlockJUnit4ClassRunner.validateConstructor(BlockJUnit4ClassRunner.java:124)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:355)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:57)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:104)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:config/applicationContext-http-int.xml",
"classpath:config/web-application-config.xml" })
public class TestValidatePolicy extends BaseTest{
@Autowired
private Service Service;
private String Number;
private String Code;
@Parameters
public static Collection primeNumbers() {
return Arrays.asList(new Object[][] {
{ "8001060001045", "86502" },
{ "8001060001039", "85902" },
});
}
public TestValidatePolicy(String Number,String Code){
this.Number = Number;
this.Code = Code;
}
@Test
public void testValidatePolicyDetails() throws Exception {
String xmlValue = getStringFromStream("validatePolicy.xml");
Assert.assertEquals(xmlValue, Service.getDetails(Number,Code));
}
}
1 ответ
Ваш тестовый класс имеет конструктор с двумя аргументами:
public TestValidatePolicy(String Number,String Code){
...
}
Сообщение об ошибке говорит (правильно):
Test class should have exactly one public zero-argument constructor
Либо создайте конструктор с нулевым аргументом явно:
public TestValidatePolicy() {
...
}
... или избавиться от конструктора с двумя аргументами.
- но вы пытаетесь запустить параметризованные тесты jUnit4. Для этого требуется @RunWith, чтобы указать параметризованный бегун:
@RunWith(Parameterized.class)
... но вы заменили это на Spring Runner:
@RunWith(SpringJUnit4ClassRunner.class)
Вы не можете иметь две аннотации @RunWith, и (насколько я знаю) нет ParameterizedSpringJUnit4ClassRunner
, Так что делать?
Я нашел предложение здесь.
Использование:
@RunWith(Parameterized.class)
Поскольку вы не можете использовать Spring Runner, вам нужно вручную настроить то же поведение:
@RunWith(Parameterized.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class EmailTest {
private TestContextManager testContextManager;
@Before
public void setUpContext() throws Exception {
//this is where the magic happens, we actually do "by hand" what the spring runner would do for us,
// read the JavaDoc for the class bellow to know exactly what it does, the method names are quite accurate though
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
}
@Parameters
public static Collection<object []> data() {
...
}