在测试BusinessFlow的 class 中,我有一些私有服务字段和一个具有Java String类型的私有字段。

在我的测试课中,我有

@RunWith(MockitoJUnitRunner.class)
public class BusinessFlowTest {
    // How can I mock or spy this?
    private String code = "codeValue";
    @Mock
    private Service1Api service1;
    @Mock
    private Service2Api service2;
    @InjectMocks
    private BusinessFlow flow;
    ...
}
@InjectMocks@Mock批注极大地创建了模拟并注入了服务字段。但是,由于Mockito不允许为code类创建模拟,如何为final字段创建模拟?

我看到的一个选择是使用CharSequence接口而不是String字段类型,但是它需要更改BusinessFlow类的代码,我不喜欢这个想法。

更新:BusinessFlow定义如下
@Service
public class BusinessFlow {
    @Autowired
    @Qualifier(value = "clientCode")
    private String code;

    @Autowired
    private Service1Api service1;
    @Autowired
    private Service2Api service2;

    ...
}

出于某种原因,我们不使用Spring Integration测试功能,也不想在不同类型的注入(例如ctor注入)中重做BusinessFlow

最佳答案

模仿是为了模仿外部依赖关系,这些依赖关系在测试环境中过于禁止而无法旋转,或者在其他方面则不必要。您可以对诸如服务和DAO层访问点之类的东西进行模拟,以确保您所做的只是一个单元测试。

您想要做的是为您运行的每个测试更改此字段的值,独立于模拟。记住-这些模拟是外部依赖项。您可以轻松控制*进入您的 class 的字符串。

例如,在您的测试中:

@Test
public void testWithFoo() {
    // given
    flow.setValue("foo");

    // when
    // invoke a pertinent method

    // then
    // observe results
}

*:如果不能这样做,这是一个重构的好机会。

07-26 06:29