Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 使用Mockito和PowerMock验证传递给静态方法的参数_Java_Unit Testing_Mockito_Static Methods_Powermockito - Fatal编程技术网

Java 使用Mockito和PowerMock验证传递给静态方法的参数

Java 使用Mockito和PowerMock验证传递给静态方法的参数,java,unit-testing,mockito,static-methods,powermockito,Java,Unit Testing,Mockito,Static Methods,Powermockito,我试图通过验证void方法调用静态方法时传递给它的参数来测试void方法。静态方法负责持久化这些参数 class ProxyHandler { public void process(String str) { // parse the str and populate x, y, z PersistManager.proxy(x, y, z); } } 下面的PersistManager包含我试图捕获它接收的参数的静态方法 class PersistManager

我试图通过验证void方法调用静态方法时传递给它的参数来测试void方法。静态方法负责持久化这些参数

class ProxyHandler {
  public void process(String str) {
    // parse the str and populate x, y, z
    PersistManager.proxy(x, y, z); 
  }
}
下面的PersistManager包含我试图捕获它接收的参数的静态方法

class PersistManager {
  public static void proxy(String x, String y, String z) {
    // persist the x, y, z
  }
}
最后是我的测试类,测试ProxyHandler:

@RunWith(PowerMockRunner.class)
@PrepareForTest(PersistManager.class)
public class TestProxyHandler() {
   private ProxyHandler handler;

   @Before
   public void setUp() {
     handler = new ProxyHandler();
   }

   @Test
   public void testProxy() {
     PowerMockito.mockStatic(PersistManager.class);
     ArgumentCaptor<String> arg1 = ArgumentCaptor.forClass(String.class);
     ArgumentCaptor<String> arg2 = ArgumentCaptor.forClass(String.class);
     ArgumentCaptor<String> arg3 = ArgumentCaptor.forClass(String.class);

     handler.process("a long string");
     PowerMockito.verifyStatic(PersistManager.class, times(1));
     PersistManager.proxy(arg1.capture(), arg2.capture(), arg3.capture());
     assertEquals("x", arg1.getValue());
   }
}
我还注意到,如果我将times(1)的值更改为任何其他值,verifyStatic仍然会通过。
我做错了什么?

很抱歉这么晚才回答这个问题,但我只是偶然发现了它,因为我正在用Powermockito调查其他事情。我将您的情况复制如下(对不起,我不喜欢默认的软件包):

package de.scrum_master.stackoverflow.q49946922;
类持久化管理器{
公共静态void代理(字符串x、字符串y、字符串z){
System.out.printf(“持久化%s,%s,%s%n”,x,y,z);
}
}
package de.scrum_master.stackoverflow.q49946922;
公共类代理处理程序{
公共作废进程(字符串str){
字符串[]params=str.split(“”);
PersistManager.proxy(参数[0],参数[1],参数[2]);
}
}
package de.scrum_master.stackoverflow.q49946922;
导入org.junit.Before;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.mockito.ArgumentCaptor;
导入org.powermock.api.mockito.PowerMockito;
导入org.powermock.core.classloader.annotations.PrepareForTest;
导入org.powermock.modules.junit4.PowerMockRunner;
导入静态org.junit.Assert.assertEquals;
导入静态org.mockito.mockito.times;
@RunWith(PowerMockRunner.class)
@PrepareForTest(PersistManager.class)
公共类ProxyHandlerTest{
私有代理处理器;
@以前
公共作废设置(){
handler=新的ProxyHandler();
}
@试验
公共void testProxy(){
mockStatic(PersistManager.class);
ArgumentCaptor arg1=ArgumentCaptor.forClass(String.class);
ArgumentCaptor arg2=ArgumentCaptor.forClass(String.class);
ArgumentCaptor arg3=ArgumentCaptor.forClass(String.class);
process(“一个长字符串”);
verifyStatic(PersistManager.class,times(1));
PersistManager.proxy(arg1.capture()、arg2.capture()、arg3.capture());
assertEquals(“a”,arg1.getValue());
assertEquals(“long”,arg2.getValue());
assertEquals(“字符串”,arg3.getValue());
}
}
这是完美的。您可能做错了什么,或者代码中有问题没有显示出来。没有必要切换到JMockit


顺便说一句,我使用了PowerMock 2.0.2、Mockito 2.23.0、JUnit 4.12、Java 8。

verifyStatic不需要times参数-它的默认值似乎是1次。我还看到,
arg2,capture()
是用逗号完成的-我猜这是发帖时的拼写错误?不过,我对PowerMockito不太熟悉,所以我不能完全肯定是否会回答这个问题。您对“,”的回答是正确的。固定的。我知道默认时间是1,但我想强调的是,即使我通过了2,3,它仍然会通过。只是一个评论,我最终使用了JMockit,因为我从来没有设法让它工作。对于任何有相同问题的人,我强烈建议使用JMockit来测试上面这样的遗留代码。你有没有这样做过?
Wanted but not invoked PersistManager.proxy(
    null,
    null,
    null
);
Actually, there were zero interactions with this mock.