是否可以使用在对象层次结构中某处调用的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()
在单元测试中,我想从obtainSalary
对方法class A
进行单元测试,但同时模拟C,以便在替换getDatabaseSalary()
的返回值时在层次结构中调用此方法。
答案 0 :(得分:1)
实际上,如果你测试'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 ();
}
}
答案 1 :(得分:0)
我还没试过这个,但看看它是否有效,或者它的某些变化。
class YourTestClass {
@Mock(answer = Answers.RETURNS_SMART_NULLS)
C c;
@InjectMocks
B b;
@InjectMocks
A a;
}
然后在测试中,为c.getDatabaseSalary方法执行when..thenReturn
。
答案 2 :(得分:0)
您可以对设计进行一些修改。
修改:根据您的评论,您正在进行集成测试。测试看起来像这样。
@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();
}