Mockito 将 Mock 注入间谍对象

我正在为一个具有2级依赖注入的类编写一个测试用例。我对1级依赖注入对象使用@Spy注释,并且我想模拟第2级注入。但是,我一直在第二级上获得空指针异常。有没有办法将模拟注入@Spy对象?

public class CarTestCase{
    @Mock
    private Configuration configuration;

    @Spy 
    private Engine engine;

    @InjectMocks 
    private Car car;

    @Test
    public void test(){

       Mockito.when(configuration.getProperties("")).return("Something");
       car.drive();
    }

}

public class Car{
    @Inject
    private Engine engine;

    public void drive(){
        engine.start();
    }
}

public class Engine{
    @Inject 
    private Configuration configuration;

    public void start(){
        configuration.getProperties();   // null pointer exception
    }

}

答案 1

我还徘徊过如何向间谍注入模拟。

以下方法将不起作用

@Spy
@InjectMocks
private MySpy spy;

但是,当同时使用注释和手动模拟时,可以通过“混合”方法实现所需的行为。以下工作完美:

@Mock
private NeedToBeMocked needToBeMocked;

@InjectMocks
private MySpy mySpy;

@InjectMocks
private SubjectUnderTest sut;

@BeforeMethod
public void setUp() {
    mySpy = Mockito.spy(new MySpy());
    MockitoAnnotations.initMocks(this);
}

(SubjectUnderTest这里依赖于 ,而反过来又依赖于 )。MySpyMySpyNeedToBeMocked

UPD:就个人而言,我认为如果你必须经常做这样的魔术,这可能表明你的类之间的依赖性有问题,值得执行一些重构来改进你的代码。


答案 2

对我有用的(最简单的)解决方案。

@InjectMocks
private MySpy spy = Mockito.spy(new MySpy());

在这种情况下,只要测试类用 注释即可。MockitoAnnotations.initMocks(this)@RunWith(MockitoJUnitRunner.class)


推荐