所以我有三个类:A,B,C。我需要为类A
编写单元测试。
class A extends B{
//fields go here ...
public A(String string, ...){
super.(string,...);
}
//other methods here ...
}
class B{
C stuff;
//other stuff
}
所以C
是一个重要的资源(如JDBC或ssh Session)。当然,我在嘲笑C
。我如何模仿B
。想象一下B
有许多扩展它的子类。
我的主要问题是A
正在调用super.(...)
。我不想仅仅为了测试而将方法注入A
。对我来说这是糟糕的设计。有关如何嘲笑父母的任何想法吗?
例如,我无法class MockB extends B{...}
然后尝试MockB obj = new A();
这不起作用,因为MockB
和A
都是B
的孩子。
答案 0 :(得分:7)
你真的不应该试图模拟被测试类的超类。虽然一些模拟框架允许“部分模拟”可能部分模拟你实际测试的类,但这是一个坏主意。
如果类A
以及A
和B
之间的关系足够复杂,您认为您需要这些,那么它们可能根本不应该属于继承关系。
考虑更改您的代码,以便B
委托给A
而不是扩展代码。
答案 1 :(得分:3)
你想要模拟B类,这意味着你可能没有测试B或A.所以你为什么要关心它是否称为super,foo,bar或其他方法?你知道jdbc调用了多少个方法吗?但正如你所说,你嘲笑它没有问题。同样在这里。你刚才做的
B mockOfB = Mockito.mock(B.class);
就是这样。你有一个B的模拟,你可以测试你喜欢的任何调用。
如果你正在测试A那么为什么你不能简单地实例化它? B的构造函数需要一些静态依赖吗?在这种情况下,你应该重构它或使用类似powermock的东西(如果你真的不能重构这个类)。如果你不能实例化B,因为它是抽象的,那么只需在你的测试中扩展它