【问题标题】:JMockit mock protected method in superclass and still test method in real child classJMockit 模拟超类中的受保护方法,并且仍然在真实子类中测试方法
【发布时间】:2012-07-24 03:52:40
【问题描述】:

我仍在学习 JMockit,需要帮助来理解它。

我正在测试一个使用超类方法的类。我的测试在尝试使用超类方法时得到一个空指针,因为其中的代码使用 struts 动作上下文来获取会话并从会话中拉取对象。

我想绕过受保护方法中的 struts 会话内容的方法。

public class MyExtendingClass extends MySuperClass{ 
  public void methodIamTesting(){///} 
}

public abstract class MySuperClass{
  //I want to mock this method
  protected Object myProtectedSuperClassMethod(){
// struts action context code that returns an object//}
}

测试代码

@Test
public void testRunsAndDoesntPass() {
Mockit.setUpMock(MySuperClass.class, new MySuperClass(){       
  public Object myProtectedSuperClassMethod() {
      return object;
  }
}); 

// real class method invocation happens
assertEquals(expected, actual);

}

我不断得到 NullPointers,就像我没有模拟一样 不知道接下来要尝试什么。我读过的所有文档和代码示例都说只需在 setUpMock 中将超类方法声明为 public,它应该可以工作。

我不能模拟整个班级,因为那是我正在测试的班级。

【问题讨论】:

    标签: junit mocking superclass jmockit


    【解决方案1】:

    我发现我需要创建 MockClass 然后使用 setupmock 正确引用它。

    我真的爱上了 JMockit。

    @MockClass(realClass = MyExtendingClass.class)
    public static class MockSuperClass {
      final Object object = new Object();
    
      @Mock
      public Object myProtectedSuperClassMethod() {
          return object;
     }}
    @Test
    public void testRunsAndNowWillPass() {
    
    Mockit.setUpMock(MySuperClass.class, new MockSuperClass(){
    public Object myProtectedSuperClassMethod() {
      return object;
    }});
    // real class method invocation happens where i set expected and actual
    assertEquals(expected, actual);
    }
    

    【讨论】:

    • 这对我来说就像一个奇迹!太感谢了。 JMockit 太强大了
    【解决方案2】:

    你完全屏蔽了父类实现@Mocked final MySuperClass base

    abstract class MySuperClass{
        protected Object myProtectedSuperClassMethod(){
    }
    
    class MyExtendingClass extends MySuperClass{ 
        public void methodIamTesting(){///} 
    }
    
    @Test
    public void testRunsAndDoesntPass(@Mocked final MySuperClass base ) {
        //you could mask out all the base class implementation like this
        new Expectations(){{
            invoke(base, "myProtectedSuperClassMethod");
        }};
    
        // real class method invocation happens
        // ...
        assertEquals(expected, actual);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2011-07-09
      • 2011-06-12
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多