相关疑难解决方法(0)

如何测试私有函数或具有私有方法,字段或内部类的类?

如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用xUnit)?或者通过内部链接(static在C/C++中)或在私有(匿名)命名空间中使其成为私有的函数?

为了能够运行测试而更改方法或函数的访问修饰符似乎很糟糕.

java tdd unit-testing

2593
推荐指数
36
解决办法
82万
查看次数

如何通过反射访问私有方法和私有数据成员?

我知道我们可以通过反射来访问私有构造函数@Sanjay T. Sharma在他的问题回答中提到:"instanceof Void"总是返回false吗?

但是,@ duffymo :

你可以使用反射访问私有 - 方法,构造函数,数据成员,一切.

  1. 如何访问私有方法和私有数据成员?
  2. 是否可以通过反射访问局部变量?
  3. 有没有办法阻止任何人访问私有构造函数,方法和数据成员?

java security reflection private

26
推荐指数
2
解决办法
6万
查看次数

关于使用反射的IllegalAccessException

我试图学习反射,我遇到了这个IllegalAccessException.请参阅以下代码:

public class ReflectionTest
{
      public static void main(String[] args)
      {
           Set<String> myStr = new HashSet<String>();
           myStr.add("obj1");
           Iterator itr = myStr.iterator();
           Method mtd = itr.getClass().getMethod("hasNext");
           System.out.println(m.invoke(it));
      }
} 
Run Code Online (Sandbox Code Playgroud)

当我尝试运行此程序时,我得到以下内容:

Exception in thread "main" IllegalAccessException
Run Code Online (Sandbox Code Playgroud)

我不明白发生了什么.有任何想法吗?提前致谢.

java reflection

14
推荐指数
3
解决办法
4万
查看次数

通过JMockit调用私有方法来测试结果

我使用JMockit 1.1,我想做的就是调用私有方法并测试返回值.但是,我无法从JMockit De-Encapsulation示例中了解如何执行此操作.

我试图测试的方法是这个类中的私有方法:

public class StringToTransaction {
   private List<String> parseTransactionString(final String input) {
      // .. processing
      return resultList;
   }
}
Run Code Online (Sandbox Code Playgroud)

我的测试代码如下.

@Test
public void testParsingForCommas() {
   final StringToTransaction tested = new StringToTransaction();
   final List<String> expected = new ArrayList<String>();
   // Add expected strings list here..
   new Expectations() {
      {
         invoke(tested, "parseTransactionString", "blah blah");
         returns(expected);
      }
   };
}
Run Code Online (Sandbox Code Playgroud)

而我得到的错误是:

java.lang.IllegalStateException:此时缺少对mocked类型的调用; 请确保仅在声明合适的模拟字段或参数后才会出现此类调用

也许我在这里误解了整个API,因为我认为我不想模拟这个类..只是测试调用私有方法的结果.

java junit jmockit private-methods

14
推荐指数
1
解决办法
3万
查看次数

Kotlin数据类:如果在编译时我不知道它的名字,如何读取属性的值?

如果属性名称仅在运行时已知,我如何读取Kotlin数据类实例中的属性值?

kotlin data-class

12
推荐指数
3
解决办法
1万
查看次数

使用包私有方法以便于单元测试是一个好习惯吗?

有时候,如果我将某些方法的可见性从私有更改为私有,为了便于单元测试模拟,断言,我发现自己处于单元测试会更容易的情况下......

一个例子就是这样

假设我有一个包含4个属性X,Y,Z和R的对象A,其中X,Y和Z是集合,R是每个集合的不同元素之间的关系,例如,关系将由X的元素组成, Y的元素和Z的元素.对象A不允许直接访问X,Y,Z或R,而是提供了一个丰富的API,允许您在X,Y和Z上创建新元素,也允许您将这些元素混合成新的R元素.对于单元测试,使用公共getX(),public getY(),public getZ()和public getR()方法非常方便,因此每次调用时我都可以对对象的内部做出确切的断言.对象API.但是,暴露X,Y和Z是我想要防止的,这就是为什么从非常开始的对象使这些元素变得私有,并且只使用它的API提供对它们的间接访问.然而,提供包私有方法getX(),getY(),getZ()和getR()是否有意义,以便至少形成单元测试我可以轻松检查对象的内部状态是否是预期的?

缺点当然是方法的可见性增加,并且鉴于这种方法是私有的,有充分的理由,感觉有点奇怪.

当然我可以使用反射来达到同样的效果,但感觉更脏.

所以问题是,这是一种好的还是坏的做法?这是代码味吗?它会发生在别人身上吗?这有更好的技术吗?

java unit-testing encapsulation

9
推荐指数
1
解决办法
2569
查看次数

关闭Java HTTP客户端

有没有办法java.net.http.HttpClient立即释放它所持有的资源?

在内部,它包含一个选择器,一个连接池和一个Executor(当使用默认值时).但它没有实现Closeable/ AutoCloseable.

java java-http-client java-11

9
推荐指数
2
解决办法
967
查看次数

JavaFX 11 替换 column.impl_setWidth()?

我写了一个自定义的 TableColumn 宽度调整策略。您可以在 github 上的Java 8 / JavaFX 8 下查看其代码。如您所见,在方法distributeSpaceRatio()等地方,取决于TableColumn.impl_setWidth()我们计算后将列的宽度设置为所需的值。

我正在将我的项目迁移到 Java 11/JavaFX 11,并且该方法impl_setWidth()已从公共视图中删除。

还有另一种方法可以告诉表格列设置其宽度吗?我对任何解决方案持开放态度,只要它可靠并将 with 设置为(或接近)请求的值。

以下是我迄今为止尝试过的两个没有奏效的想法:


尝试 1:

这个给出了 NoMethodFoundException:

private void setColumnWidth ( TableColumn column, double targetWidth ) {

    try {
        Method method = column.getClass().getDeclaredMethod( "setWidth" );
        method.setAccessible( true );
        Object r = method.invoke( targetWidth );
    } catch ( Exception e ) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试 2:

这个没有效果:

private void setColumnWidth ( TableColumn column, double targetWidth ) { …
Run Code Online (Sandbox Code Playgroud)

java javafx java-11 javafx-11

5
推荐指数
1
解决办法
212
查看次数

什么时候在java中包装私有(没有显式修饰符)?

我一直在阅读教程控制对类成员的访问.我很困惑使用package-private可能是一个很好的用例.因为据我所知,您可以随时将包声明更改为此类的包声明,并将其视为公共类.我知道这不是一件好事,但是什么阻止了我?

java class-visibility

2
推荐指数
2
解决办法
9060
查看次数

如何在不同的包中调用类的私有方法

BookView.class有一个私有方法,如下所示

  public class BookView{
    private boolean importBook(String epubBookPath){
    //The function that adds books to database.
    }
  }
Run Code Online (Sandbox Code Playgroud)

我试图从另一个包中调用此函数.我的代码是

    protected void onPostExecute(String file_url) {
        // dismiss the dialog after the file was downloaded
        dismissDialog(progress_bar_type);

        /*Now we add the book information to the sqlite file.*/
        TextView textView=(TextView)findViewById(R.id.textView1);
        String filename = textView.getText().toString();
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String epubBookPath = baseDir+filename;
        Log.i("epubBookPath:",epubBookPath); //No errors till here!

        try {
            Method m=BookView.class.getDeclaredMethod("importBook");
            m.setAccessible(true);//Abracadabra 
            //I need help from here! How do i pass the epubBookPath to the …
Run Code Online (Sandbox Code Playgroud)

java

0
推荐指数
2
解决办法
3603
查看次数