我已经编写了一个测试类,如下所示
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
我想用@参数制作一个测试方法,所以请任何人帮忙找到解决方案
答案 0 :(得分:8)
我认为问题在于您定义了两个测试运行器。一个人@RunWith (Parameterized. class)
和一个春天来的,因为AbstractJUnit4SpringContextTests
定义了@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通常更像应用程序上下文缓存等等。还应该实现一种关闭应用程序上下文的拆除方法。
答案 1 :(得分:7)
当我导入错误的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时,抛出此错误 在您的情况下,它是抽象的,因此无法实例化测试助手。