繁体   English   中英

如何使用JUnit测试Java反射代码

[英]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的生产代码分开 ,例如:

  1. 一部分负责提供该接口的实例(如果确实需要,则该代码可以使用反射来完成其工作)
  2. 然后另一部分调用您要在该接口对象上调用的方法。

这样,您将获得两个可以相互独立测试的部分!

编辑:“坏设计”是什么意思-为什么要同时使用反射来做- 对象创建方法调用 您会看到,您可以简单地将创建的对象强制转换为其正确的类(至少在您定义了接口的情况下),然后对该类型的对象进行普通方法调用。

正如@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM