是否可以用对象层次结构中某个地方调用的Mockito来模拟对象?
让我们假设以下类:
@Component
Class A
@Autowired B b
method obtainSalaryA()
calls b.calculateSalary()
@Component
Class B
@Autowired C c
method calculateSalary()
calls c.getDatabaseSalary()
@Component
Class C
getDatabaseSalary()
在单元测试中,我想从class A
对方法obtainSalary
进行单元测试,但同时模拟C,以便在层次结构中调用此方法时替换getDatabaseSalary()
的返回值。
实际上,如果测试"a",则模拟类"b",并且可以从b返回所需的任何内容。如果测试"b"则模拟"c"。尝试始终在没有依赖关系的情况下进行测试(单元测试)
@RunWith(MockitoJUnitRunner.class)
public class ClinicServiceImplTests {
@Mock private B b;
@InjectMocks private A a;
@Before
public void setUp() throws Exception {
doReturn(...).when(b).someMethod ();
}
}
您可以对设计进行一些修改。
编辑:根据您的评论,您正在进行集成测试。测试会是这样的。
@Autowired
private A a;
@Autowired
private B b;
@Mock
private C c;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
b.setC(c);
when(c.getDatabaseSalary()).thenReturn(...);
a.obtainSalaryA();
}
我还没有尝试过,但看看它是否有效,或者它的一些变体。
class YourTestClass {
@Mock(answer = Answers.RETURNS_SMART_NULLS)
C c;
@InjectMocks
B b;
@InjectMocks
A a;
}
然后在测试中,对c.getDatabaseSalary方法执行when..thenReturn
。
另请参见@Mock和@InjectMocks之间的区别。