Класс Test должен иметь ровно один открытый конструктор с нулевым аргументом
Я написал тестовый класс, такой как следующий
public class MyParameterizedClassTest extends BaseRepositoryTest {
private int multiplierA;
private int multiplierB;
public MyParameterizedClassTest(int multiplierA) {
this.multiplierA = multiplierA;
}
@Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { 1 }, { 5 }, { 121 } };
return Arrays.asList(data);
}
@Test
public void testMultiplyException() {
assertEquals("Result", multiplierA * multiplierA,multiply(multiplierA));
}
public int multiply(int a){
return a*a;
}
}
И мой класс BaseRepositoryTest следует
@RunWith (Parameterized.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public abstract class BaseRepositoryTest extends
AbstractJUnit4SpringContextTests {
@Inject
SessionFactory sessionFactory;
private Transaction transaction;
public Session getSession() {
Session session;
try {
session = sessionFactory.getCurrentSession();
} catch (SessionException se) {
session = sessionFactory.openSession();
}
return session;
}
@Before
public void setUp() throws Exception {
transaction = getSession().beginTransaction();
}
@After
public void tearDown() throws Exception {
if (transaction != null) {
transaction.rollback();
}
getSession().close();
}
@Before
public void baseSetUp() {
MockitoAnnotations.initMocks(this);
}
}
Когда я запускаю свой тестовый класс, он показывает, как,
Test class should have exactly one public zero-argument constructor:at
org.junit.runners.BlockJUnit4ClassRunner.validateZeroArgConstructor
Я хочу создать метод тестирования с параметрами @, поэтому, пожалуйста, кто-нибудь может помочь найти решение
Ответы
Ответ 1
Я думаю, проблема в том, что вы определили двух тестовых участников. Один из них @RunWith (Parameterized. class)
и тот, который поставляется с spring, потому что AbstractJUnit4SpringContextTests
определяет a @RunWith(SpringJUnit4ClassRunner.class)
.
Поскольку Junit может работать только с одним @RunWith
, вы можете использовать только @Parameterized
или AbstractJUnit4SpringContextTests
. Если вы хотите использовать оба параметра, вы должны использовать @Parameterized
, а затем выполнить ту же логику, что и SpringJUnit4ClassRunner
.
Простым подходом может быть просто использование spring org.springframework.test.context.TestContextManager
.
@RunWith(Parameterized.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public abstract class BaseRepositoryTest extends AbstractJUnit4SpringContextTests {
private TestContextManager testContextManager;
@Before
public void setUpContext() throws Exception {
this.testContextManager = new TestContextManager(getClass());
this.testContextManager.prepareTestInstance(this);
}
}
Но это только гарантирует, что вызывается TestExecutionListener
. spring обычно намного больше похож на кэширование контекста приложения и т.д. Также должен быть реализован метод разрыва, который закрывает контекст приложения.
Ответ 2
Если вы используете один тест, убедитесь, что вы правильно написали имя тестового класса.
Общей ошибкой, которую я делаю, является класс с именем "Foo" и тестовый класс с именем
'FooTest'
и запустите один unit test с
'Foo'
вместо 'FooTest'
Если "Foo" имеет открытый конструктор с аргументами, я получаю ошибку:
java.lang.Exception: Test class should have exactly one public zero-argument constructor
Ответ 3
Попробуйте удалить конструктор из класса MyParameterizedClassTest.
Я получал эту ошибку, когда у моего тестового класса был открытый конструктор. После удаления все заработало.
Ответ 4
У меня есть один ответ, он исправляется на моей машине
JUnit4 → когда u проверяет исключение
org.junit.runners.BlockJUnit4ClassRunner.validateZeroArgConstructor(BlockJUnit4ClassRunner.java:171)
org.junit.runners.BlockJUnit4ClassRunner.validateConstructor(BlockJUnit4ClassRunner.java:148)
войти в первое исключение
protected void validateZeroArgConstructor(List<Throwable> errors) {
if(!this.getTestClass().isANonStaticInnerClass() && this.hasOneConstructor() && this.getTestClass().getOnlyConstructor().getParameterTypes().length != 0) {
String gripe = "Test class should have exactly one public zero-argument constructor";
errors.add(new Exception(gripe));
}
}
он будет проверять, что ваш конструктор не имеет параметров или нет.
Попробуйте ввести инжектор или поле поля (- > официально не рекомендуется)
Ответ 5
Эта ошибка возникает, когда ваш класс не определен как открытый. В вашем случае он абстрактный, поэтому он не может быть экземпляром для тестирования пропозиций