【问题标题】:Create Mockito test for class with non default constructor and dependency injection为具有非默认构造函数和依赖注入的类创建 Mockito 测试
【发布时间】:2019-01-04 07:36:10
【问题描述】:

我有一个使用依赖注入的类,并且有一个初始化附加字段的非默认构造函数。基本上这个类看起来像这样:

public class NonDefaultConstructor {
    private final String name;
    @Inject
    private SomeService service;

    public NonDefaultConstructor(ParameterObject po) {
        this.name = po.getName();
    }
}

有了这个ParameterObject

public class ParameterObject {
    private String name;

    public String getName() {
        return name;
    }
}

我想创建一个 Mockito 测试,该测试注入服务 SomeService 的模拟和构造函数参数 ParameterObject 的模拟。此尝试不起作用,因为它试图模拟尚未初始化的字段上的行为。

public NonDefaultConstructorTest {
    @Mock
    private SomeService service;
    @Mock
    private ParameterObject po;
    @InjectMocks
    private NonDefaultConstructor classUnderTest;

    @BeforeEach
    private void setup() {
        given(po.getName()).willReturn("name")
        MockitoAnnotations.initMocks(this);
    }
}

setup 方法中创建ParameterObject 也不起作用,因为这也需要在那里构造NonDefaultConstructor,然后SomeService 不会被注入。 我知道这可以通过使用反射手动注入字段来解决,但我更喜欢更优雅的解决方案。

【问题讨论】:

    标签: java dependency-injection constructor mockito


    【解决方案1】:

    您可以像这样在设置方法中“手动”创建ParameterObject

    @BeforeEach
    private void setup() {
        po = Mockito.mock(ParameterObject.class);
        given(po.getName()).willReturn("name");
    
        MockitoAnnotations.initMocks(this);
    }
    

    为了使这项工作,您还需要删除 @Mock 注释

    @Mock
    private ParameterObject po;
    

    现在,您的 ParameterObject 在创建任何其他模拟之前创建和配置,然后使用非默认构造函数注入您的类。

    【讨论】:

    • 现在 MockitoAnnotations.initMocks() 已被弃用,我想知道是否有不弃用的方法来做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多