我正在测试的类中有两个私有字段,并且这两个字段在构造函数中初始化。

现在,当我尝试使用带有@InjectMocks注释的类进行调用时,它会引发异常:

 Cannot instantiate @InjectMocks field named 'ServiceImpl' of type 'class com.test.ServiceImpl'. You haven't provided the instance at field declaration so I tried to construct the instance.


下面是一段代码。

public class ServiceImpl implements Service {

private OfficeDAO officeDAO ;

private DBDAO dbDAO ;

public ServiceImpl() {
officeDAO = Client.getDaoFactory().getOfficeDAO();
dbDAO = Client.getDaoFactory().getDBDAO();
}


我的测试课:

@RunWith(MockitoJUnitRunner.class)
public class ServiceImplTest {

    @Mock
    private OfficeDAO officeDAO;

    @Mock
    private DBDAO dbDAO;

    @Mock
    Client client;

    @InjectMocks
    private ServiceImpl serviceImpl;

    @Mock
    private Logger log;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }


请帮助我如何解决它。
任何帮助将不胜感激。

最佳答案

您正在使用@InjectMocks批注,该批注创建ServiceImpl类的实例。因为您的构造函数正在尝试从工厂获取实现:Client.getDaoFactory().getOfficeDAO(),所以您具有NPE。

确保Client.getDaoFactory()返回什么。我敢打赌它返回null,这就是问题所在:)重构代码,以便DaoFactory通过参数而不是使用静态参数传递。



我看到您现在有另外一个例外。但是基于代码,我无法真正讲更多。请提供测试失败的完整示例。

10-04 19:02