Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟静态字段';执行了什么无效方法?_Java_Mockito_Powermock - Fatal编程技术网

Java 如何模拟静态字段';执行了什么无效方法?

Java 如何模拟静态字段';执行了什么无效方法?,java,mockito,powermock,Java,Mockito,Powermock,我想测试A.b.方法()是否在类C的方法method2()中执行。 我怎么能嘲笑你?谢谢。可以是这样 public class A { public static B b = new B(); } public B{ public void method(Interface arg){} } public C { public void method2 (Object arg2){ InterfaceInstance d = new InterfaceInstan

我想测试A.b.方法()是否在类C的方法method2()中执行。 我怎么能嘲笑你?谢谢。

可以是这样

public class A { 
    public static B b = new B();
}

public B{
  public void method(Interface arg){}
}

public C {
  public void method2 (Object arg2){

    InterfaceInstance d = new InterfaceInstance;
    A.b.method(d);
  }
}
PowerMockito.mockStatic(A.class);
ArgumentCaptor captor=ArgumentCaptor.forClass(Object.class);
PowerMockito.doNothing()。何时(
类,“方法”,captor.capture()//模拟静态
C=新的C();
c、 方法2(新字符串(“模拟”);
PowerMockito.verifyStatic(次(1));
Object obj=captor.getValue()//如果需要,请检查传递的对象
可能是这样

public class A { 
    public static B b = new B();
}

public B{
  public void method(Interface arg){}
}

public C {
  public void method2 (Object arg2){

    InterfaceInstance d = new InterfaceInstance;
    A.b.method(d);
  }
}
PowerMockito.mockStatic(A.class);
ArgumentCaptor captor=ArgumentCaptor.forClass(Object.class);
PowerMockito.doNothing()。何时(
类,“方法”,captor.capture()//模拟静态
C=新的C();
c、 方法2(新字符串(“模拟”);
PowerMockito.verifyStatic(次(1));
Object obj=captor.getValue()//如果需要,请检查传递的对象

不同的观点:

静态是好的OO设计中的一个异常。您应该有很好的理由提出要调用方法的静态字段。因为它们迫使您使用PowerMock(ito)进行测试

因此:不要求助于“大”的PowerMock锤子,以某种方式使您能够测试难以测试的代码;考虑退一步,改进你的设计!
含义:静态调用在类之间创建直接的低级耦合。对于“真实世界”的应用程序,您确实希望避免这种情况。

不同的观点:

静态是好的OO设计中的一个异常。您应该有很好的理由提出要调用方法的静态字段。因为它们迫使您使用PowerMock(ito)进行测试

因此:不要求助于“大”的PowerMock锤子,以某种方式使您能够测试难以测试的代码;考虑退一步,改进你的设计!
含义:静态调用在类之间创建直接的低级耦合。对于“真实世界”的应用程序,您确实希望避免这种情况。

您有两种解决问题的方法:

  • A班的学生
对于我来说,我更喜欢在这种情况下使用suppress静态初始化,因为它给了我更多的控制

 PowerMockito.mockStatic(A.class);
 ArgumentCaptor<Object> captor = ArgumentCaptor.forClass(Object.class);
 PowerMockito.doNothing().when(
               A.class, "method", captor.capture());//mock static

 C c = new C();
 c.method2(new String("Mock"));

 PowerMockito.verifyStatic(times(1));
 Object obj = captor.getValue();//if you want check the object passed

我还没有检查密码。这是解决问题的基本思路

解决问题有两种方法:

  • A班的学生
对于我来说,我更喜欢在这种情况下使用suppress静态初始化,因为它给了我更多的控制

 PowerMockito.mockStatic(A.class);
 ArgumentCaptor<Object> captor = ArgumentCaptor.forClass(Object.class);
 PowerMockito.doNothing().when(
               A.class, "method", captor.capture());//mock static

 C c = new C();
 c.method2(new String("Mock"));

 PowerMockito.verifyStatic(times(1));
 Object obj = captor.getValue();//if you want check the object passed

我还没有检查密码。这是解决问题的基本思路

org.powermock.reflect.exceptions.MethodNotFoundException:未找到参数类型为的方法我已更改代码。方法arg被设计为接口。但是在method2中,已经创建了接口的实例。我无法在ArgumentCaptor.forClassorg.powermock.reflect.exceptions.MethodNotFoundException中使用interface.class:未找到参数类型为的方法我已更改代码。方法arg被设计为接口。但是在method2中,已经创建了接口的实例。我不能在ArgumentCaptor.ForClassic中使用interface.class如果我可以修改代码,我不会要求它here@wmmj23你不会相信我听到过多少次相反的话。在这种情况下,kuhajeyan的答案可能会对您有更多帮助。如果我可以修改代码,我不会问它here@wmmj23你不会相信我听到过多少次相反的话。在这种情况下,kuhajeyan的回答可能会对你有更多帮助。