Java 如何告诉Mockito使用帮助器类的真实(未修改)版本?

Java 如何告诉Mockito使用帮助器类的真实(未修改)版本?,java,spring,junit,mocking,mockito,Java,Spring,Junit,Mocking,Mockito,对于Mockito,我习惯于将mock注入到测试中的单个类中,如下所示: @RunWith(MockitoJUnitRunner.class) public class MyClassTest() { @InjectMocks private MyClass myClass; @Mock private OtherClass1 mockedClass1UsedByMyClass; @Mock private OtherClass2 mocked

对于Mockito,我习惯于将mock注入到测试中的单个类中,如下所示:

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

    @Mock
    private OtherClass1 mockedClass1UsedByMyClass;

    @Mock
    private OtherClass2 mockedClass2UsedByMyClass;
但假设MyClass还使用了一个简单的类HelperClass,它提供了一些简单的helper方法,并且没有任何进一步的依赖关系:

public class MyClass {
    @Autowired
    private OtherClass1 otherClass1;

    @Autowired
    private OtherClass2 otherClass2;

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

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

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

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

    @Mock
    private OtherClass1 mockedClass1UsedByMyClass;

    @Spy
    private HelperClass helperClass;

    @Mock
    private OtherClass2 mockedClass2UsedByMyClass;
}

如果您想利用@InjectMocks,请使用。。默认情况下,它将使用原始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是接口,您必须使用一个实现。如果您希望能够对不同的测试用例使用不同的实现,那么您需要在每个类中手动创建一个间谍,并可能使用MyClass的setter手动注入它。很好的答案,谢谢!我唯一需要做的不同的事情是显式指定impl类而不是接口,因为在实际代码中,一些模拟类实际上是接口,与@Mock不同,@Spy只与类一起工作。是的,如果您的HelperClass是接口,您必须使用一个实现。如果您希望能够对不同的测试用例使用不同的实现,那么您需要在每个类中手动创建一个间谍,并可能使用MyClass的setter来手动注入它