0

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

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

4

2 回答 2

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);
}
于 2015-01-08T04:28:57.807 回答
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);
}
于 2012-07-25T17:04:34.593 回答