我有一个示例类“ A”,正在进行单元测试。我需要规定类“ X”的行为,以便它给我一个我在单元测试中指定的随机数,而不是一个生成的值。我不确定应该模拟哪个类,我需要具有X的行为,除了它从抽象类“ Y”继承的方法“ getGen()”之外,或者我有其他方法可以做什么我想要做。
另外,仅仅为了单元测试我的代码而重写类X中的“ getGen()”是多么愚蠢的想法?还是我的代码无法测试?
测试A级:
class A {
public Type method(Typ1 a) {
//do something
X x = new X(a, String a);
x.doSmething();
//do something?
}
}
X级:
final class X extends Y {
Typ1 t;
String x;
X(Typ1 t, String x) {
this.t = t;
this.x = x;
}
public void doSomething() {
int x = getGen().method(x);
//do something
}
}
抽象类y:
abstract class Y {
Obj getGen(){
return someInstanceOfObj;
}
}
对象类:
class Obj {
int method(){
return someNumber;
}
}
最佳答案
您省略了几乎所有可见性修饰符,所以我假设所有都是package private except
doSomething()`。
在这种情况下,您要在与类Y
相同的程序包中进行单元测试,并测试类X
(因此,必须从类final
中删除X
关键字):
@Test
public void doSomething_delegatesToObj(){
// arrange
X x = Mockito.spy(new X());
Obj o = mock(Obj.class);
doReturn(o).when((Y)x).getObj(); // must be in same package as Y for this.
// act
x.doSomething();
// assert
verify(o).method(/*not sure what belongs here*/);
}
关于java - 不遵循SOLID原理的类的部分 mock (尤其是依赖注入(inject)),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41725821/