2016-10-07 57 views
0

我有一个通过反射调用方法的java类。该方法创建数据库连接并执行数据库操作。我想用junit测试我的反射代码。有没有办法做到这一点?如何使用JUnit测试java反射代码

请在下面找到我的代码片段。

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测试用例?

+0

您可以先修复代码片段中的编译错误吗? –

+0

代码片段只是一个模拟代码。 – rDX

+0

发布正确的代码会增加获得答案的机会。 –

回答

0

没有真正的“纯单元测试”测试方式* ReflectionClass **。通常情况下,你可以通过在生产代码中提供一个模拟该类的实例来进行单元测试;那么你可以使用模拟框架来验证预期的方法被调用。

但在你的情况,你创建的代码是根本很难测试(如果您想了解如何解决这部分,你可能想观看这些videos)。你基本上直接在生产代码中调用“新”;因此没有办法插入一个模拟对象。除此之外,你也不能嘲笑这些反射方法。

也许获得此代码测试的唯一选择是将Mokito与PowerMock一起使用。但我不是那方面的专家,也不能向你保证它会起作用。

我向你推荐:先退后一步,看看你是否可以用远离使用反射,或者至少:在这里分开关注点。因为说:你的生产设计看起来奇怪;而不是花费数小时才能得到某种单元测试的结果;你应该花一小段时间来改善你的设计! “难以测试”通常意味着“设计可以改进”!

含义:首先创建一个接口,表示要测试的功能。然后你分开的ReflctionClass你的产品代码,如:

  1. 一部分是负责提供该接口的实例(和代码可以使用反射做的工作,如果是真的需要)
  2. 然后另一部分调用你想在该接口对象上调用的方法。

通过这样做,你会得到部分可以独立试探对方的!

编辑:我所说的“坏设计”的意思是 - 你为什么使用反射来一举两得 - 对象创建方法调用?你看,你可以简单地将创建的对象转换为正确的类(至少如果你有一个定义的接口),然后对该类型对象进行普通的方法调用。

0

由于@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无法模拟构造函数。