Mockito:调用层次结构中的mock对象-链式调用



是否可以用对象层次结构中某个地方调用的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之间的区别。

相关内容

  • 没有找到相关文章

最新更新