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

时间:2014-10-31 10:16:47

标签: java junit parameters

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

    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

我想用@参数制作一个测试方法,所以请任何人帮忙找到解决方案

6 个答案:

答案 0 :(得分:8)

我认为问题在于您定义了两个测试运行器。一个人@RunWith (Parameterized. class)和一个春天来的,因为AbstractJUnit4SpringContextTests定义了@RunWith(SpringJUnit4ClassRunner.class)

由于Junit只能处理一个@RunWith,因此您只能使用@ParameterizedAbstractJUnit4SpringContextTests。如果你想同时使用两者,你​​必须使用@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通常更像应用程序上下文缓存等等。还应该实现一种关闭应用程序上下文的拆除方法。

答案 1 :(得分:7)

JUnit 4 vs 5(木星)

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

答案 2 :(得分:5)

如果您正在运行单个测试,请确保您正确编写了测试类名称

我做的一个常见错误是有一个名为'Foo'的类和一个名为

的测试类
  

'FooTest'

并使用

运行单个单元测试
  

'富'

而不是'FooTest'

如果'Foo'有一个带参数的公共构造函数,我会得到错误:

java.lang.Exception: Test class should have exactly one public zero-argument constructor

答案 3 :(得分:1)

尝试从 MyParameterizedClassTest 类中删除构造函数。

当我的测试类具有公共构造函数时,出现此错误。删除后,它开始工作。

答案 4 :(得分:0)

我有一个答案,它修复了我的机器 JUnit4 - &gt;当你检查异常时

 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));
    }

}

它会检查你的构造函数是否为无参数 尝试setter注入或字段( - &gt;字段不建议正式)

答案 5 :(得分:0)

当您的班级未定义为public时,抛出此错误 在您的情况下,它是抽象的,因此无法实例化测试助手。