使用非默认构造函数和依赖项注入为类创建Mockito测试

时间:2019-01-04 07:36:11

标签: java dependency-injection constructor mockito

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

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);
    }
}

ParameterObject方法中创建setup也不起作用,因为这也需要在此处构造NonDefaultConstructor,然后再注入SomeService。 我知道可以通过使用反射手动注入字段来解决此问题,但我希望使用更优雅的解决方案。

1 个答案:

答案 0 :(得分: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在创建任何其他模拟之前就已创建和配置,然后使用非默认构造函数注入到您的类中。

相关问题