当前位置: 首页 > 知识库问答 >
问题:

模仿受超级类保护的方法为@Mock on类变量返回null

阎承
2023-03-14

我试图为一个最常见的场景编写一个单元测试。

class A{
  protected void m1() {
    //something
  }
}
//class A is from a different/external binary

class B extends A {
@Autowired Properties props
  public void m2() {
    //something
    if(props.getSomething()) {
      m1();
    }    
  }
}

class BTest {
  @Mock Properties props;

  @Test
  public void testM2() {
    MockB b = mock(MockB.class);
    doNothing().when(b).m1();
    when(b.m2()).thenCallRealMethod();
    when(props.getSomething()).thenReturn(1);
  }

  class MockB extends B {
   @Override
   public void m1() {
    return;
   }
  }
}

问题是,到目前为止,测试失败了。当我试着调试测试时,我观察到null被注入到props中,这导致了NPE。当我从测试中删除类实现时,我可以看到props mock工作正常,但在m1()调用中失败了。有人能帮我一下我缺少什么吗?我试着用MockB b引用道具,比如b.props,但这也是NPE。非常感谢您的帮助。

共有1个答案

弘烨烁
2023-03-14

我只使用mockito,你不需要模拟类,下面应该工作

   class BTest {
        @Mock
        private Prop props;
    
        @Test
        public void testM2() {
            B bSpy = spy(new B(props));
            when(props.getSomething()).thenReturn(1);
            doNothing().when((A) bSpy).m1();
            doCallRealMethod().when(bSpy).m2();
            
            bSpy.m2();
        }
    }

如果您使用over. m1(),这将不起作用

 类似资料:
  • 我有两个不同包的亲子班。我正在重写受保护类型的方法。我想访问子类中的超类保护方法。 考虑以下代码: 认为我是Java新手,并在main方法中提供替代comment的答案。

  • 我尝试模拟父类的受保护方法。因此,我使用&。我的家长班。

  • 问题内容: 关键字授予对相同包和子类(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)中的类的访问权限。 现在,每个类都有一个超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)。 因此,我得出结论,即使每个类都可以访问的方法。

  • 问题内容: 下面的代码由于某种原因给我一个错误,有人可以告诉我这是什么问题。 基本上,我创建了2个Point&Circle类。Circle正在尝试继承Point类。 错误: 问题答案: 看起来您可能已经修复了原始错误,该错误是由错误消息所指示的,尽管您的修复稍有不正确,而不是应该使用的类。 请注意,在的方法中还有一个错误调用的地方: 这在Python 3上是有效的代码,但是在Python 2上需要

  • 我正在阅读这本Java SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?

  • 如何使用Mockito或PowerMock模拟一个由子类实现,但从抽象超类继承的受保护方法? 换句话说,我想测试“DoSomething”方法,同时嘲弄“DoSomethingElse”。 抽象超类 子类实现 解决方案 这里给出的答案是正确的,如果涉及的类是在同一包中,将会起作用。 但如果涉及不同的包,一个选择是使用PowerMock。下面的例子对我有效。当然可能有其他的方法,这是一个可行的。 注