Mockito:调用层次结构中的模拟对象 - 链接调用

时间:2014-11-04 18:12:30

标签: java spring unit-testing mocking mockito

是否可以使用在对象层次结构中某处调用的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()的返回值时在层次结构中调用此方法。

3 个答案:

答案 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

另见Difference between @Mock and @InjectMocks

答案 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();
}