JMockit模拟了超类中的受保护方法,并且仍然是真实子类中的测试方法

时间:2012-07-25 16:31:22

标签: junit mocking superclass jmockit

我还在学习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,它应该可以工作。

我无法模拟整个课程,因为那是我正在测试的课程。

2 个答案:

答案 0 :(得分:0)

我发现我需要创建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);
}

答案 1 :(得分:0)

完全掩盖父类实现@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);
}