在测试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
}
*:如果不能这样做,这是一个重构的好机会。