首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Java反射访问测试用例中的受保护方法

使用Java反射访问测试用例中的受保护方法
EN

Stack Overflow用户
提问于 2011-01-12 08:21:11
回答 3查看 34.8K关注 0票数 21

我试图使用Java反射获取和调用位于不同类和不同包中的受保护方法。

包含受保护方法的类:

代码语言:javascript
复制
package com.myapp;

public class MyServiceImpl {

   protected List<String> retrieveItems(String status) {
         // Implementation
   }
}

调用类:

代码语言:javascript
复制
package xxx.myapp.tests;

import com.myapp.MyServiceImpl;

public class MyTestCase {

    List<String> items;

    public void setUp() throws Exception {

         MyServiceImpl service = new MyServiceImpl();
         Class clazz = service.getClass();

         // Fails at the next line:
         Method retrieveItems = clazz.getDeclaredMethod("retrieveItems");

         // How to invoke the method and return List<String> items?
         // tried this but it fails?
         retrieveItems.invoke(clazz, "S");
    }
}

编译器抛出此异常:

代码语言:javascript
复制
java.lang.NoSuchMethodException: com.myapp.MyServiceImpl.retrieveItems()
EN

回答 3

Stack Overflow用户

发布于 2011-01-12 08:25:00

代码的问题在于,getDeclaredMethod函数同时按名称和参数类型查找函数。通过呼叫

代码语言:javascript
复制
Method retrieveItems = clazz.getDeclaredMethod("retrieveItems");

代码将查找不带参数的方法retrieveItems()。您要查找的方法确实接受一个参数,即一个字符串,因此您应该调用

代码语言:javascript
复制
Method retrieveItems = clazz.getDeclaredMethod("retrieveItems", String.class);

这将告诉Java搜索retrieveItems(String),这正是您要查找的内容。

票数 27
EN

Stack Overflow用户

发布于 2017-03-02 16:21:54

您应该在invoke方法中使用到已创建对象的链接,而不是到类的链接,并使用Method.setAccessible(true)调用来解锁访问:

代码语言:javascript
复制
public void setUp() throws Exception {
    MyServiceImpl service = new MyServiceImpl();
    Class<?> clazz = service.getClass();
    Method retrieveItems = clazz.getDeclaredMethod("retrieveItems", String.class);
    retrieveItems.setAccessible(true);
    items = (List<String>)retrieveItems.invoke(service, "S");
}
票数 7
EN

Stack Overflow用户

发布于 2011-01-12 08:25:43

与其使用复杂的反射,为什么不简单地创建一个派生类,它可以访问受保护的方法呢?

有关进一步的想法,请参阅Is it bad practice to use Reflection in Unit testing?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4664192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档