Java 带参数的模拟方法

Java 带参数的模拟方法,java,mockito,Java,Mockito,我试图模仿下面的一行,但它在执行时给出了一个错误,它说: 此处检测到放错位置的参数匹配器: 不能在验证或存根之外使用参数匹配器 正确使用参数匹配器的示例: when(mock.get(anyInt()).thenReturn(null) doThrow(newruntimeexception()).when(mock).someVoidMethod(anyObject()) 验证(mock).someMethod(包含(“foo”)) 此外,此错误可能会出现,因为您将参数匹配器用于 无法模拟的方

我试图模仿下面的一行,但它在执行时给出了一个错误,它说:

此处检测到放错位置的参数匹配器:

不能在验证或存根之外使用参数匹配器

正确使用参数匹配器的示例:

when(mock.get(anyInt()).thenReturn(null)

doThrow(newruntimeexception()).when(mock).someVoidMethod(anyObject())

验证(mock).someMethod(包含(“foo”))

此外,此错误可能会出现,因为您将参数匹配器用于 无法模拟的方法。不能使用以下方法 存根/验证:final/private/equals()/hashCode()

org.mockito.exceptions.misusing.invalidUseofMatchers异常: 代码行是:

课程有点像这样:

public class SomeClass {
    public static String method(String URL, String str) {
    //functioning
        return "";
    }
}
PowerMockito.mockStatic(NameOfClass.class);
expect( NameOfClass.nameOfMethod((URL)Mockito.any(),Mockito.anyString())).andReturn(actualOutput);

如何模拟它?

您可以在Mockito之上使用PowerMockito。大概是这样的:

public class SomeClass {
    public static String method(String URL, String str) {
    //functioning
        return "";
    }
}
PowerMockito.mockStatic(NameOfClass.class);
expect( NameOfClass.nameOfMethod((URL)Mockito.any(),Mockito.anyString())).andReturn(actualOutput);

您可以在Mockito之上使用PowerMockito。大概是这样的:

public class SomeClass {
    public static String method(String URL, String str) {
    //functioning
        return "";
    }
}
PowerMockito.mockStatic(NameOfClass.class);
expect( NameOfClass.nameOfMethod((URL)Mockito.any(),Mockito.anyString())).andReturn(actualOutput);

我无法更改代码中的内容……这是一个旧代码,在很多地方都得到了使用–NealGul

而不是使用Powermock:

当静态方法在代码库中的许多位置被引用时,如何将其转换为非静态方法? 有3个简单、快速和安全的步骤:

  • 创建该方法的非静态副本(使用新名称):

  • 让静态版本调用非静态版本:

    class StaticMethodRefactoring {
        static int staticMethod(int b) {
            return new StaticMethodRefactoring(). nonStaticMethod(b);
        }
    
        int nonStaticMethod(int b) {
            return b;
        }
    }
    
  • 使用IDE的内联方法重构将静态访问替换为非静态访问

    很可能存在删除该方法的旧静态版本的选项。如果其他一些项目使用这种静态方法,您可能需要保留它

    IDE还在访问静态方法的位置提供内联方法特性。通过这种方式,您可以根据需要逐步更改为非静态访问

  • 就这样

    在当前IDE会话中所有打开的项目中,对静态方法的任何访问都将被替换。现在,您可以更改测试中的类,通过构造函数或任何其他DI机制注入实例,并用简单的mockito mock替换测试中的is


    我无法更改代码中的内容……这是一个旧代码,在很多地方都得到了使用–NealGul

    而不是使用Powermock:

    当静态方法在代码库中的许多位置被引用时,如何将其转换为非静态方法? 有3个简单、快速和安全的步骤:

  • 创建该方法的非静态副本(使用新名称):

  • 让静态版本调用非静态版本:

    class StaticMethodRefactoring {
        static int staticMethod(int b) {
            return new StaticMethodRefactoring(). nonStaticMethod(b);
        }
    
        int nonStaticMethod(int b) {
            return b;
        }
    }
    
  • 使用IDE的内联方法重构将静态访问替换为非静态访问

    很可能存在删除该方法的旧静态版本的选项。如果其他一些项目使用这种静态方法,您可能需要保留它

    IDE还在访问静态方法的位置提供内联方法特性。通过这种方式,您可以根据需要逐步更改为非静态访问

  • 就这样


    在当前IDE会话中所有打开的项目中,对静态方法的任何访问都将被替换。现在,您可以更改测试中的类,通过构造函数或任何其他DI机制注入实例,并用一个简单的mockito mock替换测试中的is…

    @TimothyTruckle抱歉,我们已经监督了这个细节。mockito不能模拟静态方法的细节应该是答案的一部分,解释OP为什么应该使用其他framework@Jens-对不起that@TimothyTruckle很抱歉,我监督了这个细节。mockito不能模拟静态方法的细节应该是答案的一部分,以解释OP为什么应该使用其他方法framework@Jens-很抱歉,而Powermock(-ito)解决您的实际问题—您不应该使用
    静态方法。它们使您的代码缺乏灵活性,难以重用。您模拟它们进行测试的问题是该设计缺陷的一个症状。我无法更改代码中的内容…..这是一个旧代码,在许多地方都被使用您自己的应用程序中有这么多“地方”吗?您是否已将@RunWith(PowerMockRunner.class)runner添加到您的类中?另外,尝试用@PrepareForTest(SomeClass.class)注释测试类,而Powermock(-ito)解决了实际问题,您不应该使用
    静态方法。它们使您的代码缺乏灵活性,难以重用。您模拟它们进行测试的问题是该设计缺陷的一个症状。我无法更改代码中的内容…..这是一个旧代码,在许多地方都被使用您自己的应用程序中有这么多“地方”吗?您是否已将@RunWith(PowerMockRunner.class)runner添加到您的类中?同时尝试用@PrepareForTest(SomeClass.class)注释测试类是不可能的…我不允许更改该方法…高年级学生拒绝了我的建议在这种情况下:让他们自己编写单元测试,不管怎样,这是他们工作的一部分…这个方法在我的课堂上被调用。我正在为我的课堂制作Junit,为此我需要模仿这个方法…如果我也要求的话,很抱歉much@NealGul“这个方法在我的类中被调用,我正在为我的类生成Junit”,然后创建一个委托给静态方法的包装器对象。您可以“重用”此方法来包装程序中的任何其他静态方法调用。@NealGul“如果我要求太多,请原谅”没有任何借口!我们都需要要求学习一些东西……不可能……我不允许改变这种方法……在这种情况下,高年级学生拒绝了我的建议:让他们自己编写单元测试,不管怎样,这是他们工作的一部分…这个方法在我的课堂上被调用。我正在为我的课堂制作Junit,为此我需要模仿这个方法…如果我也要求的话,很抱歉much@NealGul“这个方法在我的类中被调用,我正在为我的类生成Junit”,然后创建一个委托给静态方法的包装器对象。您可以“重用”它来包装程序中的任何其他静态方法调用。@NealGul“对不起,如果我是askin