我正在尝试使用JMockit进行Android应用的单元测试。这有点棘手,因为在本地JVM中执行测试意味着所有Android类都是存根,但你可以模拟它们,这不是问题。
但是现在我想在嵌套类中测试一个方法,该类是ResultReceiver的子类。该类嵌套在Fragment中。问题是,当我创建这个嵌套类时,我想模拟它的构造函数,因为它会引发异常(它是一个存根)。我试图隔离代码,问题不是Android,而是类结构。例如:
基类:
public class JM_base {
int m_i;
public JM_base(int i) {
m_i = i;
}
}
嵌套类:
public class JM_nested_class_cons {
public class Nested extends JM_base {
public Nested(int i) {
super(i);
}
public void methodToTest() {
System.out.print("System under test!");
}
}
}
测试:
public class Test_JM_nested_class_cons {
@Mocked JM_nested_class_cons mock;
@Test
public void test() {
new MockUp<JM_nested_class_cons.Nested>() {
@Mock public void $init(int i) {
System.out.println("Hi!");
}
};
JM_nested_class_cons.Nested t = mock.new Nested(1);
t.methodToTest();
}
}
据我了解,永远不应该调用Nested()的“真正”构造函数,并且“嗨!”应该出现在控制台中,对吗?我做错了什么?
THX
答案 0 :(得分:3)
这里的问题是MockUp
将JM_nested_class_cons.Nested
视为常规的非内在类。因此,它没有考虑到每个构造函数都有一个隐藏的第一个参数用于外部对象(JM_nested_class_cons
)。
解决方法是在@Mock
方法中为内部类的构造函数显式声明这个额外参数:
@Mock
void $init(JM_nested_class_cons outer, int i) {
System.out.println("Hi!");
}