java - 在最终(实用程序)类中模拟私有(private)静态方法

标签 java unit-testing mockito powermock utility-method

有没有办法测试以下类,模拟私有(private)方法 getMessage()

我尝试过使用 jUnit + Mockito + PowerMock,但找不到方法(无需修改源代码或进行反射更改)。

有什么想法吗?

public final class One {
    public static String met1() {
        return getMessage();
    }
    private static String getMessage() {
        return "ciao";
    }
    private One() {
        // Empty
    }
}

最佳答案

PowerMockito 可以让您模拟类的所有静态方法,但您需要确保您的 met1 方法仍然调用真正的方法:

@RunWith( PowerMockRunner.class )
@PrepareForTest( One.class )
public class OneTest
{
  @Test
  public void testOne()
  {
    PowerMockito.mockStatic( One.class );
    try
    {
      PowerMockito.when( One.met1() ).thenCallRealMethod();
      Method getMessage = PowerMockito.method( One.class, "getMessage" );
      PowerMockito.when( getMessage.invoke( null ) ).thenReturn( "test" );
    }
    catch ( Exception e )
    {
      e.printStackTrace();
    }
    assertEquals( "test", One.met1() );
  }
}

关于java - 在最终(实用程序)类中模拟私有(private)静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22169378/

相关文章:

unit-testing - 有没有办法在 IntelliJ Idea 的编辑器 View 上显示单元测试覆盖的行?

angular - 具有名称的表单控件没有值访问器...用于垫选择控件

java - 是否可以模拟通过反射访问的嵌套对象?

java - 如何在服务层单元测试中模拟数据库结果?

Java 枚举和嵌套类

java - Mockito 验证参数包含另一个忽略大小写的字符串

java - Dozer 映射 vs get

php - 如何启动 TDD/BDD PHP CodeIgniter

PowerMock 和 EasyMock 上的 java.lang.IllegalArgumentException : Not a mock: java. lang.Class

java - ReentrantLock - 这是使用它的有效方法吗