我还在学习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,它应该可以工作。
我无法模拟整个课程,因为那是我正在测试的课程。
答案 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);
}