【发布时间】:2022-02-08 03:40:24
【问题描述】:
我写了一个测试类,如下所示
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做一个测试方法,所以请谁能帮忙找到解决办法
【问题讨论】:
-
看起来错误的测试运行器正在执行您的任务。我们需要弄清楚为什么要解决这个问题。
-
你确定你的类都被正确编译了吗?您的例外提到了
BlockJUnit4ClassRunner,但Parameterized不是BlockJUnit4ClassRunner的子类。见junit.sourceforge.net/javadoc/org/junit/runners/…。似乎您编译的代码不包含@RunWith (Parameterized. class) -
是的,我尝试使用 @RunWith (Parameterized.class),现在它在 com.kgfsl.collections.core.security.BaseRepositoryTest.getSession(BaseRepositoryTest.java:45) 处显示 java.lang.NullPointerException com.kgfsl.collections.core.security.BaseRepositoryTest.setUp(BaseRepositoryTest.java:54) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
-
@Duncan:我的回答肯定是基于基本的 Java 知识:Java Constructors-Note,请参阅注释。如果一个类定义了一个显式构造函数,它就不再有一个默认构造函数来设置对象的状态。如果这样的类需要默认构造函数,则必须提供其实现。如果在这种情况下未提供显式默认构造函数,则任何调用默认构造函数的尝试都将是编译时错误。
-
@RenéLink 它非常适合我 rene。感谢您的解决方案
标签: java junit parameters