java - Mockito 将模拟注入(inject) Spy 对象

标签 java unit-testing dependency-injection mockito

我正在为具有 2 级依赖注入(inject)的类编写测试用例。我对 1 级依赖注入(inject)对象使用 @Spy 注释,我想模拟第 2 级注入(inject)。但是,我在第二级不断收到空指针异常。有什么方法可以将模拟注入(inject)@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
    }

}

最佳答案

我也徘徊过如何将模拟注入(inject) spy 。

以下方法将不起作用:

@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依赖于MySpy,而MySpy又依赖于NeedToBeMocked)。

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

关于java - Mockito 将模拟注入(inject) Spy 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43926636/

相关文章:

java - Autowiring 后 Spring 更改 Map 键

java - 带有 TextFormatter 和/或 UnaryOperator 的 JavaFX 8 中用于整数的数字文本字段

reactjs - 类型错误 : Cannot destructure property 'instrument' of 'options' as it is undefined

unit-testing - 如何使用 dotnet test 运行来自多个库的测试,并带有单个通过/失败摘要

java - 使用 JAVA 的安全 Web 服务

python - 模拟 __init__() 进行单元测试

angular - 如何将窗口注入(inject) Angular 2.1.0

组件、服务等之外的 Angular 2 服务注入(inject)

java - 在 Guice 中使用 Mapbinder 在模块中使用 Inject

java - 在 Java 中使用 Key Vault 生成 SAS token