Класс 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

Эта ошибка возникает, когда ваш класс не определен как открытый. В вашем случае он абстрактный, поэтому он не может быть экземпляром для тестирования пропозиций