【问题标题】:How to tell Mockito to use real (unmocked) version of a helper class?如何告诉 Mockito 使用帮助类的真实(非模拟)版本?
【发布时间】:2017-03-07 11:13:16
【问题描述】:

使用 Mockito,我习惯于将 Mocks 注入到单个被测类中,如下所示:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest() {
    @InjectMocks
    private MyClass myClass;

    @Mock
    private OtherClass1 mockedClass1UsedByMyClass;

    @Mock
    private OtherClass2 mockedClass2UsedByMyClass;

但是假设MyClass 也使用了一个简单的类HelperClass,它提供了一些简单的“帮助”方法并且没有任何进一步的依赖:

public class MyClass {
    @Autowired
    private OtherClass1 otherClass1;

    @Autowired
    private OtherClass2 otherClass2;

    @Autowired
    private HelperClass helperClass; // Don't want to mock this one...

宁愿使用这个类的真实版本,也不愿尝试模拟返回的所有内容,因为它所做的只是一些简单的、确定性的处理。有没有办法做到这一点?

【问题讨论】:

    标签: java spring junit mocking mockito


    【解决方案1】:

    如果您想利用@InjectMocks,请使用@Spy.. 默认情况下它将使用原始 impl,您可以手动选择要模拟的方法:

    @RunWith(MockitoJUnitRunner.class)
    public class MyClassTest() {
        @InjectMocks
        private MyClass myClass;
    
        @Mock
        private OtherClass1 mockedClass1UsedByMyClass;
    
        @Spy
        private HelperClass helperClass;
    
        @Mock
        private OtherClass2 mockedClass2UsedByMyClass;
    }
    

    【讨论】:

    • 很好的答案,谢谢! (我唯一需要做的是明确指定 impl 类而不是接口,因为在真实代码中,这些模拟类中的一些实际上是接口,与 @Mock 不同的是,@Spy 仅适用于类。 )
    • 是的,如果您的 HelperClass 是一个接口,您必须使用您的实现之一。如果您希望能够为不同的测试用例使用不同的实现,那么您需要在每个类中手动创建一个 spy() 并可能使用 MyClass 的 setter 手动注入它
    猜你喜欢
    • 2017-03-11
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多