测试类应该只有一个公共零参数构造函数

2022-09-02 00:43:15

我写了一个测试类,如下所示

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

我想用@parameters做一个测试方法,所以请任何人都可以帮忙找到解决方案


答案 1

JUnit 4 vs 5 (木星)

当我导入错误的类时,我遇到了这个问题。当构造函数使用 JUnit 5 功能时,我导入了旧的而不是 .Testorg.junit.Testorg.junit.jupiter.api.Test


答案 2

我认为问题在于您定义了两个测试运行程序。一个是你自己,一个是春天带来的,因为 an 定义了 .@RunWith (Parameterized. class)AbstractJUnit4SpringContextTests@RunWith(SpringJUnit4ClassRunner.class)

由于 Junit 只能处理一个,因此您只能使用 或 。如果你想同时使用两者,你必须使用和而不是做与你自己做的相同的逻辑。@RunWith@ParameterizedAbstractJUnit4SpringContextTests@ParameterizedSpringJUnit4ClassRunner

一个简单的方法可以只使用弹簧的.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);
    }

}

但这只能确保调用 s。Spring通常更像应用程序上下文缓存等。此外,还应实现关闭应用程序上下文的拆卸方法。TestExecutionListener