Java 静态方法以及如何使用它们

Java 静态方法以及如何使用它们,java,spring,unit-testing,mockito,Java,Spring,Unit Testing,Mockito,在编写一些单元测试时,我发现我们使用了很多来自实用程序类的静态方法调用。现在有了莫基托,我不能嘲笑他们的呼唤。那么,最好的方法是什么 我知道我在类中编写了公共方法,在类中我只返回静态调用。例如: public String getName(File file){ return PDFUtil.getName(file); } 然后我在另一个方法中调用public方法。现在我可以用Mockito和Spying来模拟getName()方法 然而,有两件事: 有冗余。我可能在其他类中也使用了PDFU

在编写一些单元测试时,我发现我们使用了很多来自实用程序类的静态方法调用。现在有了莫基托,我不能嘲笑他们的呼唤。那么,最好的方法是什么

我知道我在类中编写了公共方法,在类中我只返回静态调用。例如:

public String getName(File file){ return PDFUtil.getName(file); }
然后我在另一个方法中调用public方法。现在我可以用Mockito和Spying来模拟
getName()
方法

然而,有两件事:

  • 有冗余。我可能在其他类中也使用了
    PDFUtil.getName(File)
    方法,因此我应该只有一个类,并且应该只实现一次getName() 我们假设有4种不同的静态方法调用,并用4种不同的方法提取它们。这些都是我现在无法测试的方法。既然有人说像getter和setter这样非常简单的方法不应该被测试,那么这可以吗

  • 可以使用直接模拟静态方法。假设你有这个班:

    public class StaticMethodClass {
       public String method() {
           return StaticMethodClass.staticMethod();
       }
    
       public static String staticMethod() {
          return "hello world";
       }
    }
    
    单元测试可以如下所示:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(StaticMethodClass.class)
    public class UnitTest {
    
       @Test
       public void test() {
          PowerMockito.mockStatic(StaticMethodClass.class);
          PowerMock.when(StaticMethodClass.staticMethod()).thenReturn("yeah");
    
          assertEquals("yeah", new StaticMethodClass().method());
       }
    }
    

    注意:我实际上并没有测试这段代码。作为提示:-)

    您可以直接使用模拟静态方法。假设你有这个班:

    public class StaticMethodClass {
       public String method() {
           return StaticMethodClass.staticMethod();
       }
    
       public static String staticMethod() {
          return "hello world";
       }
    }
    
    单元测试可以如下所示:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(StaticMethodClass.class)
    public class UnitTest {
    
       @Test
       public void test() {
          PowerMockito.mockStatic(StaticMethodClass.class);
          PowerMock.when(StaticMethodClass.staticMethod()).thenReturn("yeah");
    
          assertEquals("yeah", new StaticMethodClass().method());
       }
    }
    

    注意:我实际上并没有测试这段代码。作为一个提示:-)

    “现在使用Mockito,我无法模拟它们的调用。”如果您先编写测试,会容易得多。为什么需要模拟它们?这些方法是否可以在测试期间执行不应该执行的工作?查看powermock/powermockito,其中包含mockStatic()。将单元测试中无法使用的静态实用程序方法重构为可以注入的实用程序对象的非静态方法可能是一个好主意(最好作为参数传递给的构造函数)需要它们的对象。“现在使用Mockito,我无法模拟它们的调用。”如果您先编写测试,会容易得多。为什么需要模拟它们?这些方法是否可以在测试期间执行不应该执行的工作?查看powermock/powermockito,其中包含mockStatic()。将单元测试中无法使用的静态实用程序方法重构为可以注入的实用程序对象的非静态方法可能是一个好主意(最好作为参数传递给的构造函数)需要它们的对象。