[英]How to test java reflections code using JUnit
我有一个通过反射调用方法的java类。 该方法创建数据库连接并执行数据库操作。 我想使用junit测试我的反射代码。 有什么办法吗?
请在下面找到我的代码段。
Class DaoImpl {
public void setResult(String result) {
this.result = result
}
public String getResult() {
return this.result;
}
public void doDBoperation() {
Connection connection = getConnection();
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("Select column_name from table");
if(rs.next()) {
result = "value";
}
}
}
Class ReflectionClass {
public void invoke() {
Class<?> noParam = {};
Class<?> clazz = Class.forname("DaoImpl");
Method method = clazz.getDeclaredMethod("doDBoperation", noParam);
method.invoke(clazz.getNewInstance);
System.out.println("This is it");
}
}
如何为我的ReflectionClass编写JUnit测试用例?
没有真正的“纯单元测试”测试* ReflectionClass **的方式。 通常,您可以通过在生产代码中提供该类的模拟实例来进行单元测试。 那么您可以使用模拟框架来验证是否调用了预期的方法。
但就您而言,您创建的代码简直很难测试(如果您想学习如何处理该部分,则可能想观看这些视频 )。 您基本上是在生产代码中直接调用“ new”; 因此无法插入模拟对象。 除此之外,您还无法模拟那些反射方法。
可能要测试此代码的唯一选择是将Mokito与PowerMock一起使用。 但是我不是该领域的专家,不能保证会奏效。
我建议你:退一步第一和身材,如果你可以使用反射掉 ,或至少:在这里分离关注。 因为如上所述:您的生产设计看起来很奇怪 ; 而不是花费数小时来进行某种方式的单元测试; 您宁愿花费那部分时间来改善设计! “难以测试”通常意味着“可以改进设计”!
含义:首先,您创建一个表示要测试的功能的接口 。 然后,您将ReflctionClass的生产代码分开 ,例如:
这样,您将获得两个可以相互独立测试的部分!
编辑:“坏设计”是什么意思-为什么要同时使用反射来做- 对象创建和方法调用 ? 您会看到,您可以简单地将创建的对象强制转换为其正确的类(至少在您定义了接口的情况下),然后对该类型的对象进行普通方法调用。
正如@GhostCat建议的那样,可以使用PowerMockito
来模拟DaoImpl
的构造函数。 这是代码:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(ReflectionClass.class)
public class ReflectionClassTest {
@Test
public void invoke() throws Exception {
DaoImpl mockedDaoImpl = PowerMockito.mock(DaoImpl.class);
PowerMockito.whenNew(DaoImpl.class).withNoArguments().thenReturn(mockedDaoImpl);
new ReflectionClass().invoke();
Mockito.verify(mockedDaoImpl, Mockito.atLeastOnce()).doDBoperation();
}
}
但是,它不起作用。 通过反射调用PowerMock时,它不会设法模拟构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.