Mockito 无法注入模拟

Mockito can't inject mocks

我正在使用 Mockito,我正在尝试将 Mock CustomFileHandler 注入我的 REjercicioDAO class 以进行测试。问题是,我的测试没有抛出异常,但它没有注入我的模拟对象,原始的 @Autowired CustomFileHandler 没有被替换。这是我的代码:

@Repository
public class REjercicioDAO extends ARHibernateDAO < REjercicio > implements IREjercicioDAO {

    @Autowired
    public ICustomFileHandler customFileHandler;

    ...

}

这是我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {

    @Mock private ICustomFileHandler customFileHandler;

    @Autowired
    @InjectMocks
    private IREjercicioDAO rEjercicioDAO;

    @Before
    public void before () {

        MockitoAnnotations.initMocks(this);

        ...

    }

顺便说一句,实体按预期工作,接口正确链接到实际实体,我已经测试过了。我该如何解决这个问题?

这里没有答案。我不能提供更多,因为我真的很遗憾看到这么多人使用这种笨拙的 API 依赖于反射,而你可以通过显式设置依赖关系来为 class 的读者做一些非常清楚的事情。

The thing is, my test throws no exceptions, but it doesn't inject my mock object

不足为奇。即使没有注入成功,这种注入模拟的方式也会保持安静。 From the InjectMocks javadoc(重点不是我的!):

Mockito will try to inject mocks only either by constructor injection, setter injection, or property injection in order and as described below. If any of the following strategy fail, then Mockito won't report failure; i.e. you will have to provide dependencies yourself.

虽然 Mockito 不会报告失败,但我真的不鼓励使用这个 API。

关于你的实际问题,看看那个:

@Autowired
@InjectMocks
private IREjercicioDAO rEjercicioDAO;

您使用 Spring 和 Mockito 注释对字段进行注释。您对他们的处理顺序感到满意吗?这些来自两个不同的库。我没有说它永远不会起作用(存在运气和随机性),但您真的认为它很可靠吗?

为了达到您的要求,您可以编写类似的东西,分两步完成:
- 对象实例化:模拟依赖并注入 spring 依赖
- 关系集:模拟依赖和 spring 依赖

之间
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION)
public class REjercicioDAOTest extends ATest {

    @Mock 
    private ICustomFileHandler customFileHandler;

    @Autowired        
    private IREjercicioDAO rEjercicioDAO;

    @Before
    public void before () {    
        MockitoAnnotations.initMocks(this);
        // Set explicitly the fileHandler dependency
        rEjercicioDAO.setFileHandler(customFileHandler);         
    }
 }

您正在尝试将 IT 与单元测试混合。

1) 如果你使用的是Spring Boot:

@MockBean
private ICustomFileHandler customFileHandler;

@Autowired
private IREjercicioDAO rEjercicioDAO;

就是这样..

2) 未使用 Spring 引导:

public class TestConfig{

    @Bean
    @Primary
    public ICustomFileHandler customFileHandler(){
       return Mockito.mock(ICustomFileHandler.class);
    }

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = ATest.CONTEXT_CONFIGURATION, classes=TestConfig.class)
public class REjercicioDAOTest extends ATest {

   @Autowired
   private ICustomFileHandler customFileHandlerMock; 

    @Autowired
    private IREjercicioDAO rEjercicioDAO;

模拟被注入,您可以根据需要在测试中设置它