【问题标题】:how do i mock the a static method that provides an instance of the class being mocked with JMockit?我如何模拟提供使用 JMockit 模拟的类的实例的静态方法?
【发布时间】:2016-04-20 19:14:17
【问题描述】:

我正在尝试模拟一个单例类 (SessionDataManager),在其中我通过调用静态 getInstance() 方法获取一个实例,但所有尝试似乎都返回 null。

我试过了

    @Mocked SessionDataManager sessionDataManager;

        new MockUp<SessionDataManager>(){
            @Mock
            public SessionDataManager getInstance(Invocation invocation) {

                return invocation.getInvokedInstance(); 
            }
        };

我得到相同的结果 = null;

任何人都可以提出解决方案吗?

谢谢

【问题讨论】:

    标签: java unit-testing static java-6 jmockit


    【解决方案1】:

    我建议查看documentation,但这里有两个完整的示例测试:

    public final class ExampleTest {
        public static final class SessionDataManager {
            private static final SessionDataManager instance = new SessionDataManager();
            public static SessionDataManager getInstance() { return instance; }
            public void doSomething() { throw new UnsupportedOperationException("to do"); }
        }
    
        @Test
        public void mockingASingleton(@Mocked SessionDataManager mockInstance) {
            SessionDataManager singletonInstance = SessionDataManager.getInstance();
    
            assertSame(mockInstance, singletonInstance);
            singletonInstance.doSomething(); // mocked, won't throw
        }
    
        @Test
        public void mockingASingletonWithAMockUp() {
            new MockUp<SessionDataManager>() {
                // no point in having a @Mock getInstance() here
                @Mock void doSomething() { /* whatever */ }
            };
    
            SessionDataManager singletonInstance = SessionDataManager.getInstance();
            singletonInstance.doSomething(); // redirects to the @Mock method, won't throw
        }
    }
    

    【讨论】:

      【解决方案2】:

      看看 Expectations 的课程:

      new Expectations() {
      
          Singleton singleton;
          {
              Singleton.getInstance(); returns(singleton);
              singleton.valueFromSingleton(); returns(1);
          }
      };
      
      Entity entity = new Entity();
      assertEquals(1, entity.valueFromEntity());
      

      【讨论】:

      • 谢谢stackoverflow.com/users/6231002/aura 非常感谢您的帮助。在声明期望时,我仍然收到空指针异常。
      • 不客气。如果您解决了问题,您能否通过单击答案左侧的勾号来接受答案?谢谢。
      • stackoverflow.com/users/6231002/aura 我已经尝试完全按照您提供的方式使用代码,但我仍然遇到空指针异常
      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多